假设你的项目使用ExtJS作为表现层。你会发现,SESSION超时控制将是一个问题。

本文将就自己的经验。来解决这一问题。当然,解决这个问题并不是仅仅有一种方法,我仅仅是提出我的方法。

首先。做超时控制。必需使用过滤器,而我们既然使用了Spring MVC,那就用拦截器代替吧。写一个拦截器,用来拦截用户请求,当然。这个拦截器还须要能够配置哪些请求是不须要拦截的。

/**
*
*/
package net.bioslink.business.intercepter; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import net.bioslink.common.util.ConfigureUtil;
import net.bioslink.common.vo.Constants; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Repository;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; /**
* @author leoly
*
*/
@Repository
public class SystemAccessInterceper extends HandlerInterceptorAdapter {
private final Logger logger = Logger.getLogger(getClass()); @Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
String[] noFilters = ConfigureUtil.getStringArray("no_filter_setting");
boolean isFilter = true;
if (!ArrayUtils.isEmpty(noFilters)) {
for (String u : noFilters) {
if (uri.contains(u)) {
isFilter = false;
break;
}
}
} if (isFilter) {
// Session
Object obj = request.getSession()
.getAttribute(Constants.SESSION_ID);
if (null == obj) {
logger.info("登录超时。!");
PrintWriter writer = response.getWriter();
writer.print("<script>top.location='http://127.0.0.1:8080/VkDesktop/login/loginSystem.do';</script>SESSION_TIMEOUT_ERROR");
IOUtils.closeQuietly(writer);
return false;
} else {
request.setAttribute("LOG_ACCESS_TIME",
System.currentTimeMillis());
logger.info(obj + "訪问了" + uri);
}
}
return super.preHandle(request, response, handler);
} @Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
super.afterCompletion(request, response, handler, ex);
Object obj = request.getAttribute("LOG_ACCESS_TIME");
if (null != obj) {
long accessTime = (long) obj;
logger.info("处理请求" + request.getRequestURI() + "耗时"
+ (System.currentTimeMillis() - accessTime) + "毫秒! ");
}
}
}

然后。将这个拦截器注冊到Spring MVC中。在xxx-servlet.xml文件里加入注冊代码:

	<mvc:interceptors>
<bean class="net.bioslink.business.intercepter.SystemAccessInterceper" />
</mvc:interceptors>

OK,如今这个拦截器已经開始工作了,它会拦截用户请求,推断SESSION中是否存在登录信息,假设不存在,则说明已经超时,拦截器向客户问写一段代码

writer.print("<script>top.location='http://127.0.0.1:8080/VkDesktop/login/loginSystem.do';</script>SESSION_TIMEOUT_ERROR");

这样。假设client是网页。它就会自己主动跳到登录页面。假设不是网页(如AJAX请求)。我们须要在client中推断返回的字符串中是否包括“SESSION_TIMEOUT_ERROR”,假设有的话就做出跳到首页的处理。

那么,如今轮到client了,由于使用的是ExtJS,差点儿全部的请求都是AJAX请求。所以推断SESSION_TIMEOUT_ERROR是关键。那总不能全部的AJAX请求都加上这些推断吧??OMG,杀了我吧,可怜的码农……

事实上。我们能够写一个TimeoutControl类,封装一些我们须要改动和加入的东西,来实现超时跳转功能。谁叫ExtJS提供了这么多类功能(继承。重写,覆盖)呢?

我们知道,ExtJS的请求尽管都是AJAX请求。可是却能够区分为Store请求和一般的AJAX请求,那么我们的TimeoutControl类就须要又一次构造这些请求方式,而且,以后写的全部请求都须要使用这个类来完毕。

Ext.define('Ext.ux.TimeoutControl', {
extend : 'Ext.data.Store',
alias : 'widget.timeoutstore',
constructor : function(config) {
Ext.apply(config.proxy, {
listeners : {
exception : function(self, response) {
var responseText = response.responseText;
if (responseText
&& responseText.indexOf("SESSION_TIMEOUT_ERROR") > 0) {
top.location = '../login/loginSystem.do';
}
}
}
});
this.callParent([config]);
}, statics : {
request : function(config) {
var f = config.success;
config.success = Ext.Function.createInterceptor(f, function(
response) {
var txt = response.responseText;
// alert(txt);
if (txt && txt.indexOf("SESSION_TIMEOUT_ERROR") > 0) {
top.location = '../login/loginSystem.do';
return false;
} return true;
});
Ext.Ajax.request(config);
}
}
});

这个类中,我们继承了Ext.data.Store,而且在构造器中动态加入了一个proxy的exception处理函数,也就是说。仅仅要使用此类。不管Store的proxy中写没写exception函数。都会在这里加入上。而这个函数就是处理超时控制的。然后,这个类还提供了一个静态方法request,这个request方法会调用Ext.Ajax.request(config)。可是在调用之前。我们给配置的success函数加入了一段推断超时的代码,使用的是ExtJS的函数拦截方法,效果杠杠的。

最后,仅仅要我们在使用到Store的地方中使用Ext.ux.TimeoutControl类,在使用Ext.Ajax.request的地方中使用Ext.ux.TimeoutControl.request代替,那么。超时控制就完毕了。

使用Store的样例:

		var store = Ext.create('Ext.ux.<span style="font-size:18px; white-space: pre; background-color: rgb(240, 240, 240);">TimeoutControl</span>', {
model : 'MyDesktop.data.WorkOrderModule',
remoteSort : true,
remoteFilter : true,
sorters : [new Ext.util.Sorter({
property : 'reportId',
direction : 'ASC'
})],
proxy : {
type : 'ajax',
actionMethods : {
read : 'POST'
},
extraParams : {
projectCode : "44190008",
orderMonth : 2,
id : 0
},
pageParam : 'pageNo',
limitParam : 'pageSize',
url : '../lebang/workOrder/queryWorkorderList.do',
reader : {
type : 'json',
root : 'orders',
totalProperty : 'totalCount'
}
}
});

使用AJAX请求的样例:

					Ext.ux.TimeoutControl.request({
url : "../user/logout.do",
timeout : 60000,
method : 'POST',
disableCaching : false,
params : {},
success : function(response) {
window.location = '../login/loginSystem.do';
},
failure : function() {
Ext.Msg.alert("系统提示", "注销异常,请联系管理人员!!");
}
});



ExtJS4.2.1与Spring MVC实现Session超时控制的更多相关文章

  1. Spring MVC中Session的正确用法<转>

    Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...

  2. 【转】Spring MVC中Session的正确用法之我见

    Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...

  3. Spring MVC中Session的正确用法之我见

    Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...

  4. 【转载】spring mvc 使用session

    http://home.51.com/gaoyangboy/diary/item/10036382.html Spring2.5 访问 Session 属性的四种策略 Posted on 2008-1 ...

  5. Web应用与Spring MVC锁session

    http是无连接的,所以服务器上并不会为每个用户开辟一个线程,因为没有用户这个说法,但是服务器端是有session的,为了防止一个用户同时有多个请求在处理,spring mvc在处理请求时把sessi ...

  6. Spring Mvc session拦截器实现

    Spring Mvc拦截器实现session过期跳转到登录页面 配置拦截器 <mvc:interceptors> <mvc:interceptor> <mvc:mappi ...

  7. 理解Spring MVC Model Attribute和Session Attribute

    作为一名 Java Web 应用开发者,你已经快速学习了 request(HttpServletRequest)和 session(HttpSession)作用域.在设计和构建 Java Web 应用 ...

  8. spring mvc下shiro的session,request等问题

    最近的一个项目使用的是spring mvc,权限框架使用的是shiro. 不过有一个问题一直困扰着我,现在的session到底是谁的session,是servlet的还是shiro的. 于是我把spr ...

  9. Spring MVC 中获取session的几种方法

    Spring MVC 中使用session是一种常见的操作,但是大家上网搜索一下可以看到获取session的方式方法五花八门,最近,自己终结了一下,将获取session的方法记录下来,以便大家共同学习 ...

随机推荐

  1. spring 配置多数据源 (案例)

    *.properties配置: <!--数据连接配置一--> jdbc.type=mysqljdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:m ...

  2. Centos 7 联想Y430P无线网卡驱动安装 过程参考

    Centos 7  联想Y430P无线网卡驱动安装 过程参考 ABRT 已检测到 [root@endv ~]# yum install -y rdesktop 已加载插件:fastestmirror, ...

  3. 15款Java程序员必备的开发工具

    如果你是一名Web开发人员,那么用膝盖想也知道你的职业生涯大部分将使用Java而度过.这是一款商业级的编程语言,我们没有办法不接触它. 对于Java,有两种截然不同的观点:一种认为Java是最简单功能 ...

  4. react-native 常用组件的用法(一)

    1.View组件 View是一个支持Flexbox布局.样式.一些触摸处理.和一些无障碍功能的容器,并且它可以放到其它的视图里,也可以有任意多个任意类型的子视图. View的设计初衷是和StyleSh ...

  5. TCP/IP详解 卷一(第十四章 DNS:域名系统)

    域名系统(DNS Domain Name System)是一种用于TCP/IP应用程序的分布式数据库,它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息. 从应用角度上看,对DNS的访问时通过 ...

  6. linux配置jdk失败

    在linux下配置jdk时,/etc/profile下的配置内容是对的,可是输入java -version却发现配置没有成功,这一般都是jdk的安装文件夹权限没有提升的原因,仅仅需用chmod -R ...

  7. JavaScript匿名函数与托付

    <1> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <!-- C#匿名函数--& ...

  8. python文件备份脚本

    import osimport time source = ['D:\\MyDrivers\hotfix']   #这里可以用自然字符串表示r',因为windows下的分隔符与python的有冲突,所 ...

  9. 42:换汽水瓶ExchangeBottle

    有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个 ...

  10. win10 安装anaconda 无法使用pip 报错缺少SSL模块

    在anaconda prompt里可以正常使用pip,普通cmd下activate后也可以使用.但不激活就不行. 解决方法: 是环境变量的问题. 安装anaconda需要添加三个环境变量,而不是只添加 ...