登录超时开发总结

总结一下设计开发session登录超时的问题。

用到过滤器和ajaxSetup 技术

过滤器中doFilter方法

@Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
            ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String reqUrl = request.getRequestURI();//获取当前请求资源路径

             //这里的判断是因为我对这两个路径的请求判断是否超时
            if (reqUrl.startsWith("/clinic/") || reqUrl.startsWith("/diag/")) {
                if (request.getHeader("x-requested-with") != null
                        && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {//判断是否是ajax请求
                    String userId = Utility.getLoginUserId();//获取当前session中的user是否存在
                    if (userId == null) {//登录超时user为空
                        response.setHeader("sessionstatus", "timeout");//定义1个头部信息便于判断
                        response.setHeader("url", "/Portal.jsp");//要跳转的登录页面
                    }
                }
            }
        //如果为空证明没有登录超时继续下一个操作 不为空不继续执行 

        //如果不加此判断你这个ajax请求会继续操作数据库
        if (response.getHeader("sessionstatus") == null) {
            chain.doFilter(req, res);
        }

    }



js代码 我放在了通用的jquery.min.js里了

$.xhrPool = [];//ajax请求集合
$.xhrPool.abortAll = function() {//用于结束页面其他ajax请求
    $(this).each(function(idx, jqXHR) {
        jqXHR.abort();
    });
    $.xhrPool = [];
}; 

$.ajaxSetup({ //官方定义(为以后要用到的Ajax请求设置默认的值)我的理解就像是过滤器一样
            contentType:"application/x-www-form-urlencoded;charset=utf-8", 
            error: function (XMLHttpRequest, textStatus, errorThrown){ 
                if(XMLHttpRequest.status==403){ 
                alert('您没有权限访问此资源或进行此操作'); 
                return false; 
                } 
            },beforeSend: function(jqXHR) {//开始前
                $.xhrPool.push(jqXHR);      //添加次ajax到集合里          
            },complete:function(XMLHttpRequest,textStatus){   //这里进行判断是否超时
            var sessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus"); //通过XMLHttpRequest取得响应头,sessionstatus, 
            var url=XMLHttpRequest.getResponseHeader("url"); //获取登录页面
                if(sessionstatus == 'timeout'){  
                        $.xhrPool.abortAll(); //结束其他的ajax请求 否则可能造成多次提示超时
                         alert('登录超时, 请重新登录.');
                        window.location.href=url; //跳转到登陆页面   
             }   
       });

猜你喜欢

转载自blog.csdn.net/qq_33285338/article/details/84939329