zoukankan      html  css  js  c++  java
  • 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()方法的详解链接



  • 相关阅读:
    一个完整的移动端项目的构建步骤——框架搭构1
    简单日历,纯js
    javascript语句语义大全(7)
    微软笔试Highway问题解析
    中国电信翼支付2014编程大赛决赛
    海岛问题
    大数计算
    Dijkstra算法
    Android测试之Keycode
    字符串解析
  • 原文地址:https://www.cnblogs.com/jpfss/p/9547785.html
Copyright © 2011-2022 走看看