• 【坑】前端使用ajax异步请求以后,springMvc拦截器跳转页面无效



    前言

    本文着重解决前后端分离开发的页面调整问题。
    

    笔者,在做一个需求,需要对访问网站,但是没有登录的用户进行拦截,将他们重定向到首页。

    很简单的一个需求,使用 springMvc 的拦截器即可完成需求;但是在编码的时候,页面总是无法进行跳转。

    后来在google上一通搜索,知道了问题的原因,前后端分离,前台使用ajax异步请求的锅 ;

    ajax,何为ajax,简单说就是局部网页刷新技术。前后端分离以后,后台逐渐淡化了对页面逻辑跳转的控制,将这些交给了前端去做,前台利用ajax,异步请求后台,获得数据,局部刷新网页,实现了许多方便的功能;

    因此,即使后台进行页面跳转的编码,然后前台请求完毕以后,只会执行 ajax的回调函数,至于后台那些逻辑,对不起,我ajax一概不管滴;

    听到这里,大家也应该猜到应该怎么做了,对,开始甩锅,跟前端同学大声的说,这是你的事呀,你在ajax的回调函数里面进行页面的跳转啊,你的前台技术是怎么肥四。


    $.ajaxSetup( )

    在改动 ajax 之前不要着急,如果在上面提到的回调函数里面进行修改,那么前端同学的代码,就要改动很多,凡是涉及ajax请求的方法,都要加上页面跳转的逻辑了。。。

    这里使用 $.ajaxSetup( ),可以看着是对 ajax 的增强,对比与 spring事务的后置增强$.ajaxSetup( ) 会在每个 ajax请求完成以后得到执行(是不是感觉就是一个后置增强啊);

    将下面的代码,交给前端童鞋,让他放到 引入的公共的 js文件里面

    // 解决Ajax异步请求 springMvc 不跳转页面的问题
    $.ajaxSetup( {
    	//设置ajax请求结束后的执行动作
        complete :
            function(XMLHttpRequest, textStatus) {
    			// 通过XMLHttpRequest取得响应头,sessionstatus
                var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus");
                if (sessionstatus == "TIMEOUT") {
                    var win = window;
                    while (win != win.top){
                        win = win.top;
                    }
                    win.location.href= XMLHttpRequest.getResponseHeader("CONTEXTPATH");
                }
            }
    });
    

    这段代码的含义,大抵就是,在 ajax请求完成以后,执行 complete 回调方法,里面进行一些逻辑的判断;

    这里判断 session 的状态,如果是超时被销毁了,则进行页面的跳转,跳到 CONTEXTPATH 的值那 ;

    session 的状态以及 CONTEXTPATH 的值,由我们后台同学定义;

    如下:在拦截器的preHandle方法中,添加如下逻辑

     		HttpSession session = httpServletRequest.getSession();
            User user = (User) session.getAttribute("user");
            if (user == null) {
                // 获取到项目名,以便下面进行重定向
                String homeUrl = httpServletRequest.getContextPath();
             	// 如果是 ajax 请求,则设置 session 状态 、CONTEXTPATH 的路径值
             	// 如果是ajax请求响应头会有,x-requested-with
                if (httpServletRequest.getHeader("x-requested-with") != null && httpServletRequest.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){
                    httpServletResponse.setHeader("SESSIONSTATUS", "TIMEOUT");
                    httpServletResponse.setHeader("CONTEXTPATH", homeUrl+"/index.html");
                    // FORBIDDEN,forbidden。也就是禁止、403
                    httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN); 
                }else{
                    // 如果不是 ajax 请求,则直接跳转即可
                    httpServletResponse.sendRedirect(homeUrl+"/index.html");
                }
                return false;
            }
    

    后记

    因为以上处理,springMvc 就又可以继续愉快的处理页面的跳转了;

    主要是记住 ajax异步请求,前台的逻辑最后都走ajax的回调函数,只会接受后台的返回数据,不会搭理页面跳转这样的要求的,因为人家毕竟只是局部刷新,而后台却要整个页面刷新。。

  • 相关阅读:
    SQL Server -使用表触发器记录表插入,更新,删除行数
    利用DataSet部分功能实现网站登录
    SQL Server排序的时候使null值排在最后
    大数据操作:删除和去重
    C#匿名类型序列化、反序列化
    Js调用asp.net后台代码
    C# Excel
    ajax的介绍
    MySQL数据库的知识总结
    ASP.NET MVC 入门系列教程
  • 原文地址:https://www.cnblogs.com/young-youth/p/11665595.html
Copyright © 2020-2023  润新知