【跨域】SpringBoot跨域,拦截器中,第一次获取的请求头为NULL,发送两次请求的处理方式

摘要:
背景:跨域涉及前端分离,但跨域前端已设置为允许携带Cookieaxios。默认值为Credentials=true;后端还配置跨域浏览器以查看发送的请求。请求头包含授权原因:实际上,发送了两个请求,第一个是OPTIONS请求,第二个是GET/POST……请求不包含OPTIONS请求中请求头的参数,因此在拦截器上获得的请求头为空,
背景:

在做前后端分离时,牵扯到跨域,但是已经设置了跨域
前端设置了允许携带Cookie
axios.defaults.withCredentials = true;
后端也配置了跨域

浏览器端查看发送的请求,请求头中包含Authorization

【跨域】SpringBoot跨域,拦截器中,第一次获取的请求头为NULL,发送两次请求的处理方式第1张
【跨域】SpringBoot跨域,拦截器中,第一次获取的请求头为NULL,发送两次请求的处理方式第2张
【跨域】SpringBoot跨域,拦截器中,第一次获取的请求头为NULL,发送两次请求的处理方式第3张

原因:

实际上发送了两次请求,第一次为OPTIONS请求,第二次才GET/POST...请求

  • OPTIONS请求中,不会携带请求头的参数,所以在拦截器上获取请求头为空,自定义的拦截器拦截成功
  • 第一次请求不能通过,就不能获取第二次的请求了GET/POST...
  • 第一次请求不带参数,第二次请求才带参数
解决:

在拦截器中,如果请求为OPTIONS请求,让 OPTIONS 请求返回一个200状态码,表示可以正常访问,然后就会收到真正的GET/POST请求

String method = request.getMethod();	//输出 OPTIONS/GET/POST。。。
//如果是 OPTIONS 请求,让 OPTIONS 请求返回一个200状态码
if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
    response.setStatus(HttpServletResponse.SC_OK);
    return false;
}



拦截器完整示例
@Component
public class HttpRequestInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //origin:指定可以访问本项目的IP
        String origin = request.getHeader("Origin");
        response.setContentType("application/json;charset=UTF-8");
        response.setHeader("Access-Control-Allow-Origin", origin);
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "1800");
        //  设置  受支持请求标头(自定义  可以访问的请求头  例如:Token)
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization,token,Origin,Content-Type,Accept");
        // 指示的请求的响应是否可以暴露于该页面。当true值返回时它可以被暴露
        response.setHeader("Access-Control-Allow-Credentials", "true");
        //如果是OPTIONS请求,让其响应一个 200状态码,说明可以正常访问
        if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

配置拦截器

自定义的拦截器必须要配置,才能使用

@Configuration
public class WebConfig implements WebMvcConfigurer {

	@Autowired
    private HttpRequestInterceptor httpRequestInterceptor;
    
    // 配置拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //设置跨域得拦截器 ,/** 表示拦截所有请求
        registry.addInterceptor(httpRequestInterceptor).addPathPatterns("/**");
    }
}

免责声明:文章转载自《【跨域】SpringBoot跨域,拦截器中,第一次获取的请求头为NULL,发送两次请求的处理方式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C++04:使用Boost-小试Regex库Mapbox常用表达式整理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

计算显卡对比

科学计算显卡的几个主要性能指标:1.计算能力:每秒FLOPS浮点运算,TFLOPS代表每秒万亿次浮点运算;2.计算性能:3.视频内存大小:视频内存大小还决定了可以用于实验的样本数量和模型的复杂性。...

CAD转DXF怎么转换?教你三种转换方法

2.进入到CAD版本转换的界面中后,在选择“点击选择文件”,在跳转出的“打开”界面中打开需要转换的CAD图纸。...

【646】灰度图array转为RGB三通道array

可以使用两种方法:numpy可以通过cv2.cvtColor函数自行实现。灰度图像可以转换为RGB的所谓灰度图像,分成三个通道,这意味着三个通道都是相同的信息,相当于相同维度信息的重复。主要通过numpy实现。阵列,其可以类似于广播的形式实现。...

用python调用caffe时出错:AttributeError: 'module' object has no attribute 'bool_'

下面给出了一个解决方案,即重命名冲突的io文件:numpyと PyCaffe公司が io。年が 竞争す る よ で す$ pythonclassify。py--raw_scale255~/caffe/101_ObjectCategories/airaires/image_0001.jpg../result.npyTraceback:文件“classif.py...

vscode 用户设置与工作区设置

用户设置与工作空间设置VSCode提供了两种设置方式:-用户设置:这种方式进行的设置,会应用于该用户打开的所有工程;-工作空间设置:工作空间是指使用VSCode打开的某个文件夹,在该文件夹下会创建一个名为.vscode的隐藏文件夹,里面包含着仅适用于当前目录的VSCode的设置,工作空间的设置会覆盖用户的设置。更改默认用户设置与工作空间设置VSCode的设置...

weblogic补丁下载与安装补丁的方法

去:https://jingyan.baidu.com/article/642c9d34b3b493254a46f7e4.htmlweblogic安装应用程序后,可能会发现该版本存在漏洞。我们可以根据weblogic漏洞报告下载补丁,然后修复相应的漏洞。我们如何下载和安装修补程序?Weblogic 10.3.6.0 Linux步骤1:在Weblogic中出现...