1.简单说利用javax.servlet.Filter过滤器,当session失效的时候,做出判断返回到指定页面,一般是首页登录页面。
2.机制原理,实现javax.servlet.Filter接口
说明:
(1).Servlet容器创建一个过滤器实例
(2).过滤器实例调用init方法,读取过滤器的初始化参数
(3).过滤器实例调用doFilter方法,根据初始化参数的值判断该请求是否合法
(4).如果该请求不合法则阻塞该请求
(5).如果该请求合法则调用chain.doFilter方法将该请求向后续传递
3.在你的web.xml配置如下
<filter>
<filter-name>sessionfilter</filter-name>
<filter-class>com.zhongway.pub.SessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sessionfilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>sessionfilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
说明:我这是拦截所以jsp,和.do请求,读者可以自己根据实际项目自己写。
4.过滤器的代码:
package com.zhongway.pub;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* 功能描述:过滤器,当session失效时,指定到跳转页面
*/
public class SessionFilter implements Filter {
private FilterConfig config;
public static ThreadLocal<HttpServletRequest> threadLocal = new ThreadLocal<HttpServletRequest>();
public void setFilterConfig(FilterConfig config) {
this.config = config;
}
public FilterConfig getFilterConfig() {
return config;
}
//完成对请求或过滤的响应,根据初始化参数的值判断该请求是否合法
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) {
threadLocal.set((HttpServletRequest) request);
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
HttpSession session = req.getSession(false);
// res.setCharacterEncoding("GBK");
if (req.getHeader("X-Requested-With") != null && req.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest")) {
try {
req.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else{
res.setContentType("text/html; charset=gbk");
try {
req.setCharacterEncoding("gbk");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
String paramfilter = ""; //判断是否是登录页面
String request_uri = req.getRequestURI().toUpperCase(); // 得到用户请求的URI
String ctxPath = req.getContextPath(); // 得到web应用程序的上下文路径
String uri = request_uri.substring(ctxPath.length()); // 去除上下文路径,得到剩余部分的路径
if(null != req.getParameter("paramfilter")){
paramfilter = req.getParameter("paramfilter");
}
try {
if(paramfilter.equals("true") ||
uri.equals("/")||
uri.equals("/WELCOME.JSP") ||
uri.equals("/LOGIN.JSP")||
uri.equals("/LOGIN.do")||
//可以根据需要加上你不需要过滤的jsp或者请求
session != null){
//调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应
chain.doFilter(req, res);
}
else {
//可以自己写跳转页面方法自己选择
PrintWriter out = res.getWriter();
out.println("<script type='text/javascript'>alert('登录超时,请重新登录!');" +
"parent.parent.window.location='"+req.getContextPath()+"/web_admin/login.jsp';</script>");
return;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ServletException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//销毁过滤器的方法
public void destroy() {
// TODO Auto-generated method stub
config = null;
}
//读取过滤器的初始化参数
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
this.config = filterConfig;
}
}
5.最后说明,可以自己在web.xml设置session缓存时间,过期时间。
<session-config>
<session-timeout>15</session-timeout>
</session-config>
解释:单位分钟,本次是15分钟,如果是-1代表session永久有效。
6.如果我有登录页面两个,前台和后台,分别过期返回前台和后台,我还不知道咋写,过期我咋判断呢?