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);
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值