针对ajax请求时拦截器不跳转问题

前言


在有一次开发中,原本用的是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通过回调函数来处理这些数据

本次只针对遇到的问题进行笔记共享,如有不对或者补充的,欢迎指正。

猜你喜欢

转载自blog.csdn.net/weixin_42432697/article/details/89946288