其实对于ext处理session失效其实也很简单,就是写一个过滤器。过滤器的写法其实也很简单,首先实现javax.servlet.Filter接口,重写Filter中的init(FilterConfig config),doFilter(ServletRequest request, ServletResponse response, FilterChain chain), destroy()。相信大家看方法的名字便能知道这些方法的用处。其中过滤器的核心代码是在doFilter()方法中,在doFilter()方法中将过滤你的请求,下面给出我的doFilter()代码:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String contextPath = ((HttpServletRequest) request).getContextPath(); //拿出全文路径
String requestUri = ((HttpServletRequest) request).getRequestURI(); //取得请求路径
String appurl = requestUri.replaceFirst(contextPath, "");
this.logger.info("UrlFilter.doFilter:appurl =" + appurl);
if(this.contains(appurl)){
chain.doFilter(request, response);
} else {
HttpSession session = ((HttpServletRequest) request).getSession();
if(session.getAttribute(RoleConstants.USER) != null){
chain.doFilter(request, response);
} else {
String ajaxTag = ((HttpServletRequest) request).getHeader("Request-By");//Ext
if(ajaxTag == null || !ajaxTag.trim().equalsIgnoreCase("Ext")){
((HttpServletResponse)response).sendRedirect("timeout.jsp");
}else{
((HttpServletResponse)response).addHeader("sessionstatus", "timeout");
Map<String, Object> result = new HashMap<String, Object>();
result.put("success", false);
result.put("timeout",true);
result.put("redirectUri", "timeout.jsp");
PrintWriter out = ((HttpServletResponse)response).getWriter();
out.print(JSONArray.fromObject(result));
out.flush();
out.close();
}
//((HttpServletResponse)response).sendRedirect("login.html");
}
}
}
各位可以根据个人需求重写方法内容。
当Filter写好后便在web.xml中配置需要过滤的路径,配置如下:
<filter>
<filter-name>UrlFilter</filter-name>
<filter-class>
com.pas.action.UrlFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>UrlFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>UrlFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
在这里碰到Filter的过滤器调用先后的问题(因为本人用的是struts2),如果过滤的路径有struts过滤器过滤的路径则需要把过滤器的配置配置在struts的过滤器之前,这样才能过滤成功。
在网上也谷歌了几个ext处理session失效的问题,有些把处理放在前端,当然我们可以把处理放在后台,当判断session失效时便直接跳转到登录页面便可,在上面过滤的程序中有段代码是与前台进行交互的,主要是因为ext的异步请求,ext的异步请求都会有一个回调函数便是:Ext.Ajax.on('requestcomplete',checkSessionStatus, this); 第二个参数是回调函数名,如我的回调函数内容是:
function checkSessionStatus(conn,response,options){
//alert(response.responseText);
if(response.responseText.indexOf("<?xml")<0){
//alert(response.responseText);
var json = Ext.decode(response.responseText);
var success = "";
var timeout = "";
var redirectUri = "";
if(json != null && json.length != null){
success = json[0].success;
timeout = json[0].timeout;
redirectUri = json[0].redirectUri;
} else {
success = json.success;
timeout = json.timeout;
redirectUri = json.redirectUri;
}
if(typeof json == 'object' && !success && timeout ){
top.window.location.href = redirectUri;
}
}
}
这样便能处理ext中异步请求的session失效问题。
相关资料请参考:
http://www.myext.cn/webkf/19168.html