ajax请求的重定向处理--Request header field x-requested-with is not allowed by Access-Control-Allow-Header

简介: ajax请求的重定向处理--Request header field x-requested-with is not allowed by Access-Control-Allow-Header

需求

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

  • 前端页面发起调用
    在这里插入图片描述
  • 后端接口中重定向
    在这里插入图片描述
  • 控制台报错如下在这里插入图片描述
  • 将ajax访问的接口直接在浏览器地址栏中访问测试,发现请求内容与ajax请求的区别如下图
    在这里插入图片描述

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

解决方案

前端处理

  • 自己创建redirect.js,文件内容如下
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
<script src="/static/redirect.js"></script>

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

后端也要处理

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

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

package com.hx.myoauthclient.utils;

import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @ClassName RedirectUtil
 * @Description //TODO
 * @Author WHX
 * @Date 2022/4/15 17:11
 **/
@Slf4j
public class RedirectUtil {
   
   

    public static void redirect(HttpServletRequest request, HttpServletResponse response, String url) {
   
   
        try{
   
   
            String header = request.getHeader("X-Requested-With");
            if("XMLHttpRequest".equals(header)){
   
   
                //如果是Ajax请求
                sendRedirect(response,url);
            } else {
   
   
                response.sendRedirect(url);
            }
        }
        catch(Exception ex){
   
   
            ex.printStackTrace();
        }
    }

    private static void sendRedirect(HttpServletResponse response, String url){
   
   
        try {
   
   
            // 写入响应头,然后前端去判断  enableRedirect=true则进行跳转
            response.setHeader("redirectUrl", url);
            response.setHeader("enableRedirect","true");
            response.flushBuffer();
        } catch (IOException ex) {
   
   
            log.error("Could not redirect to: " + url, ex);
        }
    }
}
相关文章
|
2月前
|
JSON 前端开发 JavaScript
axios请求成功而$.ajax却不行排错
axios请求成功而$.ajax却不行排错
27 2
|
12天前
|
XML 前端开发 JavaScript
JavaScript进阶 - AJAX请求与Fetch API
【7月更文挑战第3天】前端开发中的异步基石:AJAX与Fetch。AJAX,使用XMLHttpRequest,处理跨域、回调地狱和错误处理。Fetch,基于Promise,简化请求,但需注意默认无跨域头和HTTP错误处理。两者各有优劣,理解其问题与解决策略,能提升前端应用的性能和用户体验。
|
19天前
|
前端开发 Python
Django框架中Ajax GET与POST请求的实战应用
Django框架中Ajax GET与POST请求的实战应用
|
6天前
|
XML 前端开发 JavaScript
JavaScript进阶 - AJAX请求与Fetch API
【7月更文挑战第9天】JavaScript进阶:AJAX与Fetch API对比。AJAX用于异步数据交换,XMLHttpRequest API复杂,依赖回调。Fetch API是现代、基于Promise的解决方案,简化请求处理。示例:`fetch(&#39;url&#39;).then(r =&gt; r.json()).then(data =&gt; console.log(data)).catch(err =&gt; console.error(err))`。注意点包括检查HTTP状态、错误处理、CORS、Cookie和超时。Fetch提高了异步代码的可读性,但需留意潜在问题。
|
2月前
|
JSON 前端开发 JavaScript
Fetch API与Ajax请求
Fetch API是JavaScript的一种新方法,用于网络请求,提供简洁的Promise-based语法和更多功能,如处理头、取消请求及跨域支持,比Ajax更强大。尽管不完全替代Ajax,尤其在老浏览器或需要底层控制时,Fetch API仍是现代浏览器中获取资源的优选工具。例如,以下代码展示了如何使用Fetch API进行GET和POST请求。
|
1月前
|
JSON 前端开发 JavaScript
Django——Ajax请求
Django——Ajax请求
|
2月前
|
XML JSON 前端开发
学习Ajax使用异步对象发送请求
Ajax,全称Asynchronous JavaScript and XML(异步JavaScript和XML),是一种用于创建更好、更快以及交互性更强的Web应用程序的技术。
36 3
N..
|
2月前
|
XML JSON 前端开发
jQuery实现Ajax
jQuery实现Ajax
N..
43 1
|
2月前
|
XML 前端开发 JavaScript
jQuery中ajax如何使用
jQuery中ajax如何使用
34 0
|
2月前
|
JSON 前端开发 Java
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
80 0