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();
        }
    }

然后调用即可

相关推荐
小李云雾27 分钟前
零基础-从ESS6基础到前后端联通实战
前端·python·okhttp·中间件·eclipse·html·fastapi
步步为营DotNet2 小时前
.NET 11 中 ASP.NET Core 10 在分布式系统中的安全通信与性能调优
安全·asp.net·.net
亿牛云爬虫专家2 小时前
爬虫踩坑实录:OkHttp 接入爬虫代理报 Too many tunnel connections attempted 深度解析
爬虫·okhttp·https·爬虫代理·connect·隧道代理·ip 切换
毕设源码-邱学长3 小时前
【开题答辩全过程】以 基于MVC的图书阅览器APP为例,包含答辩的问题和答案
mvc
杜子不疼.6 小时前
高并发场景下 Spring MVC + 虚拟线程 vs WebFlux 选型对比
java·人工智能·spring·mvc
人道领域1 天前
Day | 12 【苍穹外卖 :导出Excel数据表】
java·后端·sql·servlet·mvc·intellij-idea
Lyyaoo.1 天前
Spring,Spring MVC, Spring Boot
spring boot·spring·mvc
harder3211 天前
Swift 面向协议编程的 RMP 模式
开发语言·ios·mvc·swift·策略模式
杰克尼2 天前
知识点总结--day07(Spring-MVC框架)
java·spring·mvc
William_cl2 天前
[特殊字符]C# ASP.NET Core 前后端分离终极实战:JWT 身份认证与授权全流程(登录 + 鉴权 + 避坑)
c#·asp.net·状态模式