asp.net mvc 重定向问题的解决方式

前端ajax发起请求,在后端接口中重定向,结果报错,无法跳转

Ajax实际上是通过XMLHttpRequest来向服务器发送异步请求的,从服务器获取数据,然后使用JS来更新页面,这也就是常说的局部刷新实现方式,所以Ajax请求之后,服务器返回的都是纯文本流,客户端的浏览器在获取Ajax异步结果时,不是直接显示在页面上,而是要通过JS来进行处理,JS处理完以后才能显示在页面上。此处对应的JS处理就是在Ajax回调函数中执行window.location.href=path

在请求头信息中有这么一条:X-Requested-With: XMLHttpRequest,这就表明这是一个AJAX请求,我们可以通过这一信息来辨别请求是来自一般的HTTP请求还是Ajax请求。

原因:

X-Requested-With: XMLHttpRequest 表示是ajax的异步请求,而ajax的异步请求不能直接重定向,所以需要特殊处理一下

前端处理

  • 自己创建redirect.js,文件内容如下
javascript 复制代码
function  redirectHandle(xhr) {
    var url = xhr.getResponseHeader("redirectUrl");
    var enable = xhr.getResponseHeader("enableRedirect");
    
    if((enable == "true") && (url != "")){
        var win = window;
        while(win != win.top){
            win = win.top;
        }
        win.location.href = url;
    }
}

$(function () {
    $(document).ajaxComplete(function (event, xhr, settings) {
        console.log("ajaxComplete  adffdafadsaf")
        redirectHandle(xhr);
    })
})

在页面中引用该js
*

javascript 复制代码
<script src="/static/redirect.js"></script>

然后再次使用 ajax请求,就会自动走redirect.js中的重定向判断了
*

后端也要处理

  • 如果是前后端不分离项目,注意配置mvc静态资源路劲
javascript 复制代码
spring:
  mvc:
    static-path-pattern: /static/**    # 静态资源的请求还是会走过滤器、拦截器,然后直接返回该资源
  • 添加工具类

  • 使用RedirectUtil#redirect方法进行重定向处理

cs 复制代码
 public class RedirectUtil
    {
        public static void Redirect(HttpContextBase httpContext, string url)
        {
            //获取请求报文头信息(异步请求会包含这个头部信息)
            string header = httpContext.Request.Headers["X-Requested-With"].ToString();
            //判断请求客户端报文头(是否包含)
            if (string.Equals(header, "XMLHttpRequest"))
            {
                //用来验证用户是否登陆进行页面跳转
                //添加响应报文头,并发送至客户端
                SendRedirect(httpContext, url);
            }
            else
            {
                //对程序发生错误进行页面跳转
                //添加响应报文头,并发送至客户端
                SendRedirect(httpContext, url);
            }
        }

        /// <summary>
        /// 添加响应报文头
        /// </summary>
        /// <param name="filterContext"></param>
        /// <param name="url"></param>
        private static void SendRedirect(HttpContextBase httpContext, string url)
        {
            // 写入响应头,然后前端去判断  enableRedirect=true则进行跳转
            httpContext.Response.Headers.Add("redirectUrl", url);
            httpContext.Response.Headers.Add("enableRedirect", "true");
            httpContext.Response.End();
        }
    }

然后调用即可

相关推荐
步行cgn14 小时前
HTTP 请求协议详解
spring·mvc
MoRanzhi120316 小时前
第3篇 · 使用 PyQt5 实现 2048 桌面版游戏:MVC 架构与撤销和重做
python·mvc·pyqt5·桌面应用开发·gui开发·2048游戏·撤销与重做
CoderYanger1 天前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
小羊没烦恼!3 天前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
CarIise3 天前
Spring MVC 请求参数绑定与常用注解2
java·spring·mvc
CarIise3 天前
Spring MVC 请求参数绑定与常用注解
java·spring·mvc
脉动数据行情4 天前
Java OkHttp 对接国际期货批量行情 SpringBoot 定时落库实践
java·spring boot·okhttp
小羊没烦恼!6 天前
如何在IIS6,7中部署ASP.NET网站?
数据库·后端·python·web安全·asp.net
宝桥南山7 天前
.NET 11 - 尝试一下Minimal API中的异步验证新特性
microsoft·微软·c#·asp.net·.net·.netcore
Lost of 程序猿7 天前
责任链模式实战:审批流里“层层把关“的艺术
后端·设计模式·asp.net·责任链模式