zoukankan      html  css  js  c++  java
  • Session失效跳转登陆页问题

    普通请求

    Userinfo sessionUserinfo = (Userinfo)session.getAttribute("CURR_USER");
    //如果已经登录,不拦截
    if(sessionUserinfo!=null){
    	return true;
    }else {  //直接response到登陆页
    	response.sendRedirect(request.getContextPath() + "/login.jsp");
    }
    

    ajax请求

    后端java

    /*判断是否为ajax*/
    if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
    	response.setHeader("REDIRECT", "REDIRECT");  //表示重定向
    	//重定向的路径
    	response.setHeader("CONTENTPATH", request.getContextPath() + "/login.jsp");
    	response.setStatus(HttpServletResponse.SC_FORBIDDEN); //拒绝访问.
    	return false;
    }
    

    前端js

    ajax请求前设置ajaxSetup

    //因为layui-table没有解析失败的回调函数,但是底层依然是使用ajax,所以设置ajax的全局回调函数
    $.ajaxSetup({
        complete:function(XMLHttpRequest,textStatus){  //ajax完成回调函数
            //如果ajax请求状态为error
            if(textStatus=="error"){
                var redirect = XMLHttpRequest.getResponseHeader('REDIRECT');
                if(redirect=="REDIRECT"){  //判断响应头REDIRECT是否为后台设置的REDIRECT
                    var loginURL = XMLHttpRequest.getResponseHeader('CONTENTPATH');
                    window.location.href = loginURL;  //跳转到登录页
    }
            }
        }
    });
    

    login页面JS

    防止外层有frame框时在frame框里面刷新页面.

    $(document).ready(function () {
        if (window != top) {
            top.location.href = location.href;
        }
    });
    

    全部代码

    拦截器

    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class LoginInterceptor implements HandlerInterceptor {
    
    	@Override
    	public boolean preHandle(HttpServletRequest request,
    							 HttpServletResponse response, Object arg2) throws Exception {
    		String uri = request.getRequestURI();
    		HttpSession session = request.getSession();
    		if (uri.indexOf("front")>0){  //如果是前端,则不拦截
    			return true;
    		}
    
    		/*不拦截静态资源spring mvc4.3以上可以用<mvc:exclude-mapping path=""/>代替*/
    		if (uri.endsWith(".js")||uri.endsWith(".css")||uri.endsWith(".css")||uri.indexOf(".")>0){
    			//System.out.println("不拦截资源文件"+uri);
    			return true;
    		}
    
    		//如果是登录页,不拦截
    		if (uri.indexOf("login")>0){
    			return true;
    		}
    		//获取session中的CURR_USER
    		Userinfo sessionUserinfo = (Userinfo)session.getAttribute("CURR_USER");
    		//如果已经登录,不拦截
    		if(sessionUserinfo!=null){
    			return true;
    		}else {  //如果未登录,跳转到登陆页
    			if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {   /*判断是否为ajax*/
    				response.setHeader("REDIRECT", "REDIRECT");  //表示重定向
    				response.setHeader("CONTENTPATH", request.getContextPath() + "/login.jsp"); //重定向的路径
    				response.setStatus(HttpServletResponse.SC_FORBIDDEN); //拒绝访问.
    				return false;
    			} else {  //如果不是ajax请求则直接跳转到登陆页
    				System.out.println("后端拦截器,拦截访问" + uri);
    				response.sendRedirect(request.getContextPath() + "/login.jsp");
    				return false;
    			}
    		}
    	}
    }
    

    login页面JS

    防止外层有frame框时在frame框里面刷新页面.

    $(document).ready(function () {
        if (window != top) {
            top.location.href = location.href;
        }
    });
    

    前端js

    ajax请求前设置ajaxSetup,这是用于所有使用ajax的插件。可以把这段代码写在每个页面都引入的common.js里面,每个页面直接引入js即可。

    //因为layui-table没有解析失败的回调函数,但是底层依然是使用ajax,所以设置ajax的全局回调函数
    $.ajaxSetup({
        complete:function(XMLHttpRequest,textStatus){  //ajax完成回调函数
            //如果ajax请求状态为error
            if(textStatus=="error"){
                var redirect = XMLHttpRequest.getResponseHeader('REDIRECT');
                if(redirect=="REDIRECT"){  //判断响应头REDIRECT是否为后台设置的REDIRECT
                    var loginURL = XMLHttpRequest.getResponseHeader('CONTENTPATH');
                    window.location.href = loginURL;  //跳转到登录页
    }
            }
        }
    });
    
    如果这篇文章对你有用,麻烦关注一下本人微信公众号,关注送福利哦~
    微信公众号二维码
    不定期安利各种插件,编程技巧,编程思想,欢迎交流~
  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    《EffectiveJava中文第二版》 高清PDF下载
    《MoreEffectiveC++中文版》 pdf 下载
    《啊哈c语言》 高清 PDF 下载
  • 原文地址:https://www.cnblogs.com/aeolian/p/14528117.html
Copyright © 2011-2022 走看看