拦截器拦截的ajax请求无法重定向到登录页面
1、处理ajax请求重定向需要结合前端代码ajax方法进行处理。
2、后端处理:给请求头塞参数
其中重要的两个参数:REDIRECT、CONTEXTPATH
1)添加重定向标识:“REDIRECT”,告诉ajax我是重定向:response.setHeader("REDIRECT", "REDIRECT");
2)添加请求路径:“CONTEXTPATH”,告诉ajax重定向路径:response.setHeader("CONTEXTPATH", "跳转路径");
3)将自定义请求头REDIRECT、CONTEXTPATH暴露给外部:response.setHeader("Access-Control-Expose-Headers", "REDIRECT,CONTEXTPATH");
4)后端代码示例如下:
//对于请求是ajax请求重定向问题的处理方法 public void redirect(HttpServletRequest request, HttpServletResponse response) throws IOException { //获取当前请求的路径 //logger.error("请求类型:"+request.getHeader("X-Requested-With")); response.setHeader("Access-Control-Expose-Headers", "REDIRECT,CONTEXTPATH"); //告诉ajax我是重定向 response.setHeader("REDIRECT", "REDIRECT"); //告诉ajax我重定向的路径 String url = "https://xxx.xxx.xxx/";//重定向路径 response.setHeader("CONTEXTPATH", url); response.getWriter().write(1); response.setStatus(HttpServletResponse.SC_FORBIDDEN); }
// 在业务处理器处理请求之前被调用 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{ ......校验未登录 if(未登录){ redirect(request,response);//调用重定向问题处理方法 return false; }else{ return true;//请求放行 } }
//判断请求是不是ajax请求 String requestType = request.getHeader("X-Requested-With"); if("XMLHttpRequest".equals(requestType)){ System.out.println("AJAX请求.."); }else{ System.out.println("非AJAX请求.."); //此时requestType为null }
3、前端代码处理:ajax请求,自然是在ajax方法中做处理。后端传了参数的参数就是为了让前端来接收。
前端处理步骤如下:
1)在ajax方法中添加“complete ”,complete 在ajax中无论ajax请求成功或失败都会执行。
2) 在complete 中获取响应头中的参数 REDIRECT ,该参数是我们在拦截器拦截成功后塞进去,用来标识该请求是重定向请求的。
3) 获取请求路径,并跳转至重定向页面
4)前端代码示例如下:
$.ajax({ url : "......", type : "post", data : { ...... }, success : function(text) { ...... }, error : function(e, f, g) { ...... }, complete : function(xhr, status) { alert(status) //拦截器实现超时跳转到登录页面 // 通过xhr取得响应头 var REDIRECT = xhr.getResponseHeader("REDIRECT"); //如果响应头中包含 REDIRECT 则说明是拦截器返回的需要重定向的请求 if (REDIRECT == "REDIRECT") { var win = window; while (win != win.top) { win = win.top; } win.location.href = xhr.getResponseHeader("CONTEXTPATH"); } } });
或者加一个ajax全局处理函数:
$(document).ajaxComplete( function(event, jqXHR, options){ //拦截器实现超时跳转到登录页面 // 通过xhr取得响应头 var REDIRECT = jqXHR.getResponseHeader("REDIRECT"); //如果响应头中包含 REDIRECT 则说明是拦截器返回的需要重定向的请求 if (REDIRECT == "REDIRECT") { var win = window; while (win != win.top) { win = win.top; } win.location.href = jqXHR.getResponseHeader("CONTEXTPATH"); } } );