赞
踩
今天在写项目的第一个登入功能的时候,按照以往对拦截器的操作进行实现,最终请求返回200,但是页面怎么也无法跳转。重新复习了一遍拦截器之后发现操作并没有问题。
后来通过度娘发现,前端用ajax请求的时候,后端通过拦截器是无法让页面进行跳转的,具体原因还没有搞懂。
跟着度娘在拦截器中加入以下代码后发现页面终于可以跳转了。
(功能:如果没有登入过则跳转到登入页面进行登入)
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("拦截器执行了"); HttpSession session = request.getSession(); //获取当前请求的路径 String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+request.getContextPath(); //如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求,需要特殊处理 否则直接重定向就可以了 if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){ //告诉ajax我是重定向 response.setHeader("REDIRECT", "REDIRECT"); //告诉ajax我重定向的路径 response.setHeader("CONTEXTPATH", basePath+"/templates/login.jsp"); response.setStatus(HttpServletResponse.SC_FORBIDDEN); }else{ response.sendRedirect(basePath + "/templates/login.jsp"); } return false; }
$.ajaxSetup({ complete : function(xhr, status) { //拦截器实现超时跳转到登录页面 // 通过xhr取得响应头 var REDIRECT = xhr.getResponseHeader("REDIRECT"); //如果响应头中包含 REDIRECT 则说明是拦截器返回的 if (REDIRECT == "REDIRECT") { var win = window; while (win != win.top) { win = win.top; } //重新跳转到 login.html win.location.href = xhr.getResponseHeader("CONTEXTPATH"); } } });
这段代码的含义,大抵就是,在 ajax请求完成以后,执行 complete 回调方法,里面进行一些逻辑的判断;
如果响应头中包含 REDIRECT 则说明是拦截器返回的,则进行跳转,CONTEXTPATH 的值,由后台定义;
如果前端通过ajax发送请求,后端拦截器需要对页面进行跳转的话,需要通知ajax。在返回的响应头中需要写入相应的数据,前端获得数据后需要进行判断才能进行跳转。
代码应该差不多就是这样,但是具体原理还并不了解。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。