• 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()方法的详解链接



  • 相关阅读:
    IOS开发关于测试的好的网址资源
    创建型模式--工厂模式
    在XcodeGhost事件之后,获取更纯净的Xcode的方法。
    算法积累:解决如何获取指定文件夹路径或者文件路径下所有子文件后缀为.h .m .c的文本的行数
    结构型模式--装饰模式
    设计模式 总揽 通过这篇随笔可以访问所需要了解的设计模式
    IOS之未解问题--关于IOS图像渲染CPU和GPU
    链接
    Matlab2014下载和破解方法,以及Matlab很好的学习网站
    苹果Mac隐藏壁纸在哪里?Mac隐藏壁纸查找教程
  • 原文地址:https://www.cnblogs.com/jpfss/p/9547785.html
Copyright © 2020-2023  润新知