前后端分离的情况下 springmvc的拦截器的使用及配置
一、ajax重定向的问题。
默认ajax是不支持重定向的,因为ajax本身就是局部刷新,不重新加载页面的。如果需要用到重定向可以通过以下方法:
第一步:后端代码改造。
在后端(大部分情况都是拦截器)中判断是否需要重定向。
Eg:session过期判断,当判断session已经过期了,就先判断此次请求是否是ajax的请求。
方法:
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
User user = (User) request.getSession().getAttribute("user");
if (user == null) {
// 获取到项目名,以便下面进行重定向
String homeUrl = request.getContextPath();
System.out.println("homeUrl = " + homeUrl);
// 如果是 ajax 请求,则设置 session 状态 、CONTEXTPATH(要跳转的路径) 的路径值
// 如果是ajax请求响应头会有,x-requested-with
if (request.getHeader("X-Requested-With") != null
&& request.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest")) {
response.setHeader("SESSIONSTATUS", "TIMEOUT");
response.setHeader("CONTEXTPATH", homeUrl + "html/Login.html");
// FORBIDDEN,forbidden。也就是禁止、403
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
} else {
// 如果不是 ajax 请求,则直接跳转即可 但感觉还有点错误 因为每次我没登录就自动跳转了
response.sendRedirect(homeUrl + "html/Login.html");
}
}
return false;
}
}
第二步:前端改造ajax属性。
$.ajaxSetup( )
在改动 ajax 之前不要着急,如果在 $.ajax()里的回调函数(success)里面进行修改,那么前端 的代码,就要改动很多,凡是涉及ajax请求的方法,都要加上页面跳转的逻辑了。。。
这里使用 $.ajaxSetup( ),可以看着是对 ajax 的增强,对比与 spring事务的后置增强, $.ajaxSetup( ) 会在每个 ajax请求完成以后得到执行(是不是感觉就是一个后置增强啊);
$.ajaxSetup({
//设置ajax请求结束后的执行动作
complete:
function (XMLHttpRequest, textStatus) {
// 通过XMLHttpRequest取得响应头,sessionstatus
var sessionstatus = XMLHttpRequest.getResponseHeader("SESSIONSTATUS");
if (sessionstatus == "TIMEOUT") {
var win = window;
while (win != win.top) {
win = win.top;
}
win.location.href = XMLHttpRequest.getResponseHeader("CONTEXTPATH");
}
// location.href = "https://www.bilibili.com/";
}
})
});
但是这么做了之后 出现 登录拦截时 重定向次数过多
怀疑 是拦截器设置错了
**情况一:配置排除拦截路径的时候不生效 **
情况二:没有配置排除拦截路径,就是说全部路径都拦截了,导致一直重定向
个人是属于第二种情况 于是在springmvc-servlet.xml中配置 加入了对登录排除拦截的路径
改过之后 不会在出现无线重定向 但是似乎还有问题 ?? 就是无妨直接在 地址栏里 直接访问其他的页面 比如 localhost:8080/html/Index.html 会报这个错
待日后排查
附: