问题描述:

 项目中使用了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>");
                                
            }
                            
        }
                        
    }