前言
在有一次开发中,原本用的是js控制页面跳转,控制器来接收并对此请求进行拦截。
之后js模块需要增加逻辑代码,特殊要求,所以改成了ajax进行异步请求。
最后发现用ajax请求的地址在处理后拦截器并不拦截此请求,也不会进行跳转(ps:当然不会跳转了),这让我一直感觉我的拦截器地址配置写错了,进行一番查阅后,这里对这个问题进行了一些梳理
解释
ajax为异步请求,前台的逻辑最后都走ajax的回调函数,也仅走回调函数,也就是success。
只会接收后台传送过来的数据,不会对页面跳转拦截这样的请求进行处理。
解决办法
以下是经过搜索后整理的办法
使用$.ajaxSetup(),也可以理解为对ajax的增强,它会在每个ajax请求后得到执行。
// 解决Ajax异步请求 springMvc 不跳转页面的问题
$.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");
}
}
});
这段代码的含义,大抵就是,在 ajax请求完成以后,执行 complete 回调方法,里面进行一些逻辑的判断;
这里判断 session 的状态,如果是超时被销毁了,则进行页面的跳转,跳到 CONTEXTPATH 的值那 ;
session 的状态以及 CONTEXTPATH 的值,由我们后台同学定义;
如下:在拦截器的preHandle方法中,添加如下逻辑
HttpSession session = httpServletRequest.getSession();
User user = (User) session.getAttribute("user");
if (user == null) {
// 获取到项目名,以便下面进行重定向
String homeUrl = httpServletRequest.getContextPath();
// 如果是 ajax 请求,则设置 session 状态 、CONTEXTPATH 的路径值
// 如果是ajax请求响应头会有,x-requested-with
if (httpServletRequest.getHeader("x-requested-with") != null && httpServletRequest.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
httpServletResponse.setHeader("SESSIONSTATUS", "TIMEOUT");
httpServletResponse.setHeader("CONTEXTPATH", homeUrl+"/index.html");
// FORBIDDEN,forbidden。也就是禁止、403
httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
}else{
// 如果不是 ajax 请求,则直接跳转即可
httpServletResponse.sendRedirect(homeUrl+"/index.html");
}
return false;
}
附:什么是回调函数
ajax提交了一个action或do的请求,这个时候ajax是向后台请求了数据,然后后台也给了对应的数据,后台做好了该怎么给前台,这时候就有了ajax的回调函数。
回调函数是在ajax里面定义的,当请求并完成了对数据的请求时,就调用了ajax的success回调函数,把数据给ajax,然后success通过回调函数来处理这些数据
本次只针对遇到的问题进行笔记共享,如有不对或者补充的,欢迎指正。