• session过期后自动跳转到登陆页


    项目需要做一个自动登出的功能,查询了网上的资料,一开始准备用session监听做,按照下面方式配置监听器

    1.在项目的web.xml文件中添加如下代码:

    <!--添加Session监听器-->
    <listener>
    <listener-class> 监听器路径 </listener-class>
    </listener>

    2.编写java类。

    public class SessionListener implements HttpSessionListener {
     public void sessionCreated(HttpSessionEvent arg0) {
      // session创建时执行
      SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms");
      String nowtimes = simpleFormat.format(new Date());
      User u=null;
      //System.out.println("执行。。 当前时间:"+nowtimes+"_"+u);
      HttpSession ses= arg0.getSession();
      String id=ses.getId()+"_"+ses.getCreationTime();
     }
     public void sessionDestroyed(HttpSessionEvent arg0) {
      // session失效时执行
      SimpleDateFormat simpleFormat = new SimpleDateFormat("mm-ss-ms");
      String nowtimes = simpleFormat.format(new Date()); 
      //System.out.println("session失效了。。 结束时间: "+nowtimes);
     }
    }

    配置完成后等session失效后成功进入sessionDestroyed方法,准备进行页面跳转操作,突然发现怎么写跳转,愣住了,继续上网请教大神,发现这个监听是做一些后台统计处理的,无法实现页面跳转的功能。

    只能放弃这方法了,开始使用过滤器实现

    1、web.xml中添加过滤器配置

    <filter>
            <filter-name>sessionFilter</filter-name>
            <filter-class>com.orchestrall.web.helper.session.SessionFilter</filter-class>
    </filter>
    <filter-mapping>
            <filter-name>sessionFilter</filter-name>
            <url-pattern>/actions/*</url-pattern>
    </filter-mapping>

    2、新建SessionFilter类,实现Filter接口。

    public class SessionFilterimplements Filter {
        public void destroy() {
            // TODO Auto-generated method stub
        }
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            HttpServletResponse httpResponse = (HttpServletResponse) response;
            HttpSession session = httpRequest.getSession();
            // 登陆url
            String loginUrl = httpRequest.getContextPath() + "/admin/login.jsp";
            String url = httpRequest.getRequestURI();
            String path = url.substring(url.lastIndexOf("/"));
            // 超时处理,ajax请求超时设置超时状态,页面请求超时则返回提示并重定向
            if (path.indexOf(".action") != -1
                    && session.getAttribute("LOGIN_SUCCESS") == null) {
                // 判断是否为ajax请求
                if (httpRequest.getHeader("x-requested-with") != null
                        && httpRequest.getHeader("x-requested-with")
                                .equalsIgnoreCase("XMLHttpRequest")) {
                    httpResponse.addHeader("sessionstatus", "timeOut");
                    httpResponse.addHeader("loginPath", loginUrl);
                    chain.doFilter(request, response);// 不可少,否则请求会出错
                } else {
                    String str = "<script language='javascript'>alert('会话过期,请重新登录');"
                            + "window.top.location.href='"
                            + loginUrl
                            + "';</script>";
                    response.setContentType("text/html;charset=UTF-8");// 解决中文乱码
                    try {
                        PrintWriter writer = response.getWriter();
                        writer.write(str);
                        writer.flush();
                        writer.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            } else {
                chain.doFilter(request, response);
            }
        }
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            // TODO Auto-generated method stub
        }
    }

    3、客户端JS,用于ajax请求session超时

    对于jquery

    <script type="text/javascript">
    $(document).ajaxComplete(function(event, xhr, settings{  
        if(xhr.getResponseHeader("sessionstatus")=="timeOut"){  
            if(xhr.getResponseHeader("loginPath")){
                alert("会话过期,请重新登陆!");
                window.location.replace(xhr.getResponseHeader("loginPath"));  
            }else{  
                alert("请求超时请重新登陆 !");  
            }  
        }  
    });  
    </script>

    对于extjs的ajax请求

    Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this);
        function checkUserSessionStatus(conn,response,options){
            if(response.getResponseHeader("sessionstatus") == 'timeout'){
                if(response.getResponseHeader("loginPath")){
                    alert("会话过期,请重新登陆!");
                    window.top.location.href = response.getResponseHeader("loginPath");
                }else{
                    alert("请求超时请重新登陆 !");
                }
            }
        }

    如果使某个ajax请求不受全局方法的影响,那么可以在使用$.ajax()方法时,将参数中的global设置为false,jquery代码如下:

    $.ajax({
        url:"test.html",
        global:false//不触发全局ajax事件
    })
  • 相关阅读:
    使用vscode 用git 拉取代码,提示:在签出前,请清理存储库工作树
    区分手机端和pc端加载不同的样式
    关于vue的代码规范
    各种名词汇总整理
    ZB埋点汇总
    项目实战 OLAP数据提取
    大数据intern_1总结:数据埋点以及SQL复习
    leetcode 343+279+91+64+70 动态规划
    leetcode 241 加优先级括号
    leetcode 17+79+93+46+47+77+39+40+78+90+131+37 回溯法
  • 原文地址:https://www.cnblogs.com/alexxs/p/5822235.html
Copyright © 2020-2023  润新知