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);
        }
    }
}
相关文章
|
1月前
|
XML 前端开发 JavaScript
|
2月前
|
JSON JavaScript 前端开发
《进阶篇第6章:vue中的ajax》包括回顾发送ajax请求方式、vue-cli脚手架配置代理服务器、vue-resource
《进阶篇第6章:vue中的ajax》包括回顾发送ajax请求方式、vue-cli脚手架配置代理服务器、vue-resource
59 22
|
2月前
|
前端开发 JavaScript
回顾前端页面发送ajax请求方式
回顾前端页面发送ajax请求方式
38 18
|
2月前
|
前端开发 JavaScript Java
第6章:Vue中的ajax(包含:回顾发送ajax请求方式、vue-cli脚手架配置代理服务器)
第6章:Vue中的ajax(包含:回顾发送ajax请求方式、vue-cli脚手架配置代理服务器)
81 4
|
2月前
|
前端开发 JavaScript 数据处理
JQuery 拦截请求 | Ajax 请求拦截
【10月更文挑战第4天】
110 1
|
前端开发 JavaScript
$.ajax GET请求案例
$.ajax GET请求案例
53 0
|
前端开发 JavaScript
$.ajax GET请求案例(Controller的另外一种写法)
$.ajax GET请求案例(Controller的另外一种写法)
41 0
|
JSON 前端开发 数据格式
ajax请求案例
$("#button").on("click" ,function(){//jquery的写法 alert(123); $.ajax({ url:"a/toJson.
1805 0
|
XML 前端开发 JavaScript
什么是Ajax和jquery
什么是Ajax和jquery
87 0
|
7月前
|
JSON 前端开发 Java
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
157 0