Fork me on GitHub

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;  //跳转到登录页
}
        }
    }
});
posted @ 2021-03-13 11:36  秋夜雨巷  阅读(857)  评论(0编辑  收藏  举报