问题描述:
项目中使用了struts dwr spring ,利用filter过滤请求时发生问题:
1)如果filter配置为: /* 可以拦截action与jsp (但不符合需求)
2)filter配置为: *.jsp 与 *.action 时,实际是拦不住action
解决方案:
实现一个类,继承拦截器实现filter
=====================================
Session过期判断:
1) Filter中 从session中获取某个值,不存在,则session过期,从而进行相应处理
2) 利用session的方法: isNew()或者从request获取session:request.getSession(false) == null
3) 在struts的拦截器中,可以直接判断session是否过期:
ServletActionContext.getRequest().isRequestedSessionIdValid()
然后跳转到登录页面:
拦截器中代码:
if(!ServletActionContext.getRequest().isRequestedSessionIdValid()){ //session过期,转向session过期提示页,最终跳转至登录页面 HttpServletResponse response = ServletActionContext.getResponse(); HttpServletRequest req = ServletActionContext.getRequest(); String location = req.getContextPath() + "/login.jsp"; //response.sendRedirect(location); response.setContentType("text/html;charset=gb2312"); PrintWriter out = response.getWriter(); out.println("<script language='javascript' type='text/javascript'>"); out.println("alert('由于你长时间没有操作,导致Session失效!请你重新登录!');window.location.href='" + req.getContextPath() + "/login.jsp'"); out.println("</script>"); return null; }
注意:拦截器的返回值是 与action的result一致的视图名,当然可以返回null .
filter中代码:
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) arg0; HttpServletResponse resp = (HttpServletResponse) arg1; HttpSession session = req.getSession(); ServletContext sc=session.getServletContext(); String webapp = req.getContextPath(); OperatorBo operatorBo = (OperatorBo) session .getAttribute(ConstCodeDef.KEY_SESSION_OPERATORBO); String uri = req.getRequestURI(); if (operatorBo != null) { arg2.doFilter(req, resp); } else { if (uri.endsWith("login.jsp") || uri.endsWith("sale/") ) { arg2.doFilter(req, resp); }else if(uri.endsWith("manager/admin_index.jsp")){ arg2.doFilter(req, resp); }else if(uri.endsWith("manager/admin_login.jsp")){ arg2.doFilter(req, resp); } else if(uri.contains("main.jsp") || uri.endsWith("main.jsp") || uri.endsWith("main.jsp/")){ resp.sendRedirect("/sale"); }else{ //resp.sendRedirect("login.jsp"); //arg2.doFilter(req, resp); resp.setContentType("text/html;charset=gb2312"); PrintWriter out = resp.getWriter(); out.println("<script language='javascript' type='text/javascript'>"); out.println("alert('由于你长时间没有操作,导致Session失效!请你重新登录!');window.location.href='" + req.getContextPath() + "/login.jsp'"); out.println("</script>"); } } }