普通请求
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; //跳转到登录页
}
}
}
});