ajax 发送请求无法重定向问题

原因:
ajax请求默认就是不支持重定向的,因为它是局部刷新,不重新加载页面。

解决方案:

开发中需要多处使用重定向的情况下,大多都是在Spring mvc 的拦截器中,或过滤器中使用,此方法是在spring mvc拦截器中实现。
在拦截器中通过获取session(我的用户信息是存在session中)判断用户的登陆状态,没有登陆重定向到登陆页面。

请求路径获取:

1. request.getScheme() 返回当前链接使用的协议;
2. request.getServerName() 获取网站的域名;
3. request.getServerPort() 获取的服务器的请求端口;

4. request.getContextPath()获取当前的系统路径;

后端代码:

  1. import java.io.IOException;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import javax.servlet.http.HttpSession;
  5. import org.apache.log4j.Logger;
  6. import org.springframework.web.servlet.HandlerInterceptor;
  7. import org.springframework.web.servlet.ModelAndView;
  8. public class LoginInterceptor implements HandlerInterceptor{
  9. private static Logger logger = Logger.getLogger(LoginInterceptor.class);
  10. @Override
  11. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  12. throws Exception {
  13. response.setHeader("Access-Control-Allow-Origin", "http://localhost"); // 允许跨域请求
  14. response.setHeader("Access-Control-Allow-Credentials", "true");
  15. HttpSession session = request.getSession();
  16. Object userId = session.getAttribute("userId");
  17. if(userId == null){
  18. logger.info("用户未登录");
  19. requestDirect(request, response);
  20. return false;
  21. }else{
  22. return true;
  23. }
  24. }
  25. @Override
  26. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
  27. ModelAndView modelAndView) throws Exception {
  28. }
  29. @Override
  30. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  31. throws Exception {
  32. }
  33. public void requestDirect(HttpServletRequest request, HttpServletResponse response) throws IOException{
  34. //获取当前请求的路径
  35. String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+request.getContextPath();
  36. //如果request.getHeader("X-Requested-With") 返回的是"XMLHttpRequest"说明就是ajax请求
  37. if("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))){
  38. //前端需要判断是否是重定向
  39. response.setHeader("REDIRECT", "REDIRECT");
  40. //需要重定向的路径
  41. response.setHeader("CONTENTPATH", basePath+"/login.html");
  42. response.setStatus(HttpServletResponse.SC_FORBIDDEN);
  43. }else{
  44. response.sendRedirect(basePath + "/login.html");
  45. }
  46. }
  47. }

前端代码:

下面的代码请放在全局的js中 (用于初始化ajax请求,让它结束之后运行completer后面的函数)

  1. var jqxhr;
  2. //设置ajax请求完成后运行的函数,
  3. $.ajaxSetup({
  4. complete:function(){
  5. if("REDIRECT" == jqxhr.getResponseHeader("REDIRECT")){ //若HEADER中含有REDIRECT说明后端想重定向,
  6. var win = window;
  7. while(win != win.top){
  8. win = win.top;
  9. }
  10. win.location.href = jqxhr.getResponseHeader("CONTENTPATH");//将后端重定向的地址取出来,使用win.location.href去实现重定向的要求
  11. }
  12. }
  13. });

$.ajaxSetup()方法的详解链接



posted @ 2018-08-28 13:46  星朝  阅读(6889)  评论(0编辑  收藏  举报