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);
        }
    }
}
相关文章
|
8天前
|
JSON 前端开发 JavaScript
axios请求成功而$.ajax却不行排错
axios请求成功而$.ajax却不行排错
14 2
|
8天前
|
前端开发
解决前端ajax跨域请求不携带cookie信息JSESSIONID的问题
解决前端ajax跨域请求不携带cookie信息JSESSIONID的问题
|
8天前
|
JSON 前端开发 JavaScript
Fetch API与Ajax请求
Fetch API是JavaScript的一种新方法,用于网络请求,提供简洁的Promise-based语法和更多功能,如处理头、取消请求及跨域支持,比Ajax更强大。尽管不完全替代Ajax,尤其在老浏览器或需要底层控制时,Fetch API仍是现代浏览器中获取资源的优选工具。例如,以下代码展示了如何使用Fetch API进行GET和POST请求。
|
8天前
|
XML JSON 前端开发
学习Ajax使用异步对象发送请求
Ajax,全称Asynchronous JavaScript and XML(异步JavaScript和XML),是一种用于创建更好、更快以及交互性更强的Web应用程序的技术。
21 3
|
8天前
|
前端开发
AJAX发送请求方法封装和请求函数底层刨析以及axios二次封装
AJAX发送请求方法封装和请求函数底层刨析以及axios二次封装
|
8天前
|
XML JSON 前端开发
|
8天前
|
前端开发 JavaScript
|
7月前
|
前端开发 JavaScript
$.ajax GET请求案例
$.ajax GET请求案例
27 0
|
7月前
|
前端开发 JavaScript
$.ajax GET请求案例(Controller的另外一种写法)
$.ajax GET请求案例(Controller的另外一种写法)
16 0
|
JSON 前端开发 数据格式
ajax请求案例
$("#button").on("click" ,function(){//jquery的写法 alert(123); $.ajax({ url:"a/toJson.
1299 0