关于Springboot中跨域问题的解决(Response to preflight request doesn‘t pass access control check)

Response to preflight request doesn‘t pass access control check: No ‘Access-Control-Allow-Origin‘ he 当你的拦截器拦截到这种OPTIONS请求时,如果没有正确地处理(例如,返回正确的CORS头部信息),那么浏览器就会认为服务器是不可连接到的所以阻止实际的请求发送,所以我们需要确保拦截器在处理OPTIONS请求时,返回正确的CORS头部信息。预检请求是一种由浏览器自动发送的、使用OPTIONS方法的HTTP请求,它用于检查实际请求是否可以被服务器接受。使用axios请求,并在请求头添加token,发送请求,后端能成功接收请求,但请求头没有token,导致过滤器拿不到token进行校验。 阅读详情

Springboot中跨域问题的解决

等不及的小伙伴,直接跳到结论部分即可,谢谢!!!

1. 背景

1.1 使用技术栈

  • Spring Security
  • Springboot
  • Vue.axios
  • Jwt

1.2 关键代码

Spring Security实现了JWT验证

配置类相关代码

package xyz.yq56.sm.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

import xyz.yq56.sm.filter.JwtSecurityFilter;

/**
 * @author yi qiang
 * @date 2021/9/25 9:16
 */
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    JwtSecurityFilter jwtSecurityFilter;

    /**
     * 配置接收检查的http请求
     *
     * @param http http
     * @throws Exception 异常
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors(AbstractHttpConfigurer::disable)
                .csrf(AbstractHttpConfigurer::disable)
                .sessionManagement(item -> item.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeRequests(req -> req
                        .antMatchers("/user/biz/login").permitAll()
                        .anyRequest().authenticated())
                .addFilterBefore(jwtSecurityFilter, UsernamePasswordAuthenticationFilter.class)
                .httpBasic(AbstractHttpConfigurer::disable)
        ;
    }

    /**
     * 配置忽略静态资源
     *
     * @param web web
     * @throws Exception 异常
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().mvcMatchers("/public/**", "/static/**");
    }

    /**
     * 更改数据源实现
     *
     * @param auth 认证
     * @throws Exception 异常
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

    }
}

Filter相关代码: 获取JWT认证头信息,然后进行认证

package xyz.yq56.sm.filter;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.NonNull;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import lombok.extern.slf4j.Slf4j;
import xyz.yq56.easytool.enums.JwtClaimKey;
import xyz.yq56.easytool.properties.EasyToolProperties;
import xyz.yq56.easytool.provider.jwt.JwtProvider;
import xyz.yq56.easytool.utils.json.JsonUtils;
import xyz.yq56.easytool.utils.nvll.NullUtil;
import xyz.yq56.easytool.utils.string.TextUtils;
import xyz.yq56.sm.common.context.RequestContextUtil;

/**
 * @author yi qiang
 * @date 2021/10/2 2:09
 */
@Component
@Slf4j
public class JwtSecurityFilter extends OncePerRequestFilter {

    @Autowired
    EasyToolProperties easyToolProperties;

    @Autowired
    JwtProvider jwtProvider;

    @Override
    protected void doFilterInternal(
            @NonNull HttpServletRequest request,
            @NonNull HttpServletResponse response,
            @NonNull FilterChain filterChain) throws ServletException, IOException {
        if (checkJwtToken()) {
            //do something
            Map<String, Object> claims = jwtProvider.validateAccessToken(extractToken());
            if (!NullUtil.isEmpty(claims)) {
                List<String> list = TextUtils.strToList(String.valueOf(claims.get(JwtClaimKey.AUTHORITIES.getKey())));
                List<SimpleGrantedAuthority> authorities = list.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList());
                //从token获取携带的信息,然后构建UsernamePasswordAuthenticationToken,并存入context
                UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(claims.get(JwtClaimKey.SUB.getKey()), null, authorities);
                SecurityContextHolder.getContext().setAuthentication(authenticationToken);
                log.info("Token认证成功,设置context | authenticationToken: {}", JsonUtils.toJson(authenticationToken));
            } else {
                //拿不到信息就clear context
                log.info("Token认证失败,清空context | claims: {}", claims);
                SecurityContextHolder.clearContext();
            }
        } else {
            log.info("Token认证失败,清空context | Token不存在或格式异常");
            SecurityContextHolder.clearContext();
        }

        filterChain.doFilter(request, response);
    }

    /**
     * 检查头是否存在
     *
     * @return 是否为jwt
     */
    private boolean checkJwtToken() {
        String jwtHeader = extractToken();
        log.info("检查Token格式 | token: {}", jwtHeader);
        return TextUtils.isNotEmpty(jwtHeader) && jwtHeader.startsWith(easyToolProperties.getJwt().getPrefix());
    }

    private String extractToken() {
        return RequestContextUtil.getHeaderOrParam(easyToolProperties.getJwt().getHeader());
    }

}

登录接口: 获取用户信息,然后颁发令牌

package xyz.yq56.sm.module.user.controller;

import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;

import xyz.yq56.easytool.provider.jwt.JwtProvider;
import xyz.yq56.easytool.utils.collection.CollectUtil;
import xyz.yq56.easytool.utils.collection.MapUtil;
import xyz.yq56.easytool.utils.log.LogUtil;
import xyz.yq56.sm.common.dto.Result;
import xyz.yq56.sm.common.enums.LogPrefix;
import xyz.yq56.sm.common.enums.ResponseCode;
import xyz.yq56.sm.common.util.ResultUtil;
import xyz.yq56.sm.module.user.model.User;
import xyz.yq56.sm.module.user.model.UserVo;
import xyz.yq56.sm.module.user.service.UserService;

/**
 * @author yi qiang
 * @date 2021/10/1 17:40
 */
@RestController
@RequestMapping("/user/biz/")
public class UserBizController {

    @Autowired
    JwtProvider jwtProvider;

    @Autowired
    UserService userService;

    @PostMapping("login")
    public Result<UserVo> login(@RequestBody User user) {
        LogUtil.info(LogPrefix.USER_BIZ.getPrefix(), MapUtil.builder()
                .put("user", user).maps());

        List<User> userList = userService.list(Wrappers.<User>query().eq("username", user.getUsername())
                .eq("password", user.getPassword()));
        if (CollectUtil.isEmpty(userList)) {
            return ResultUtil.fail(ResponseCode.USER_NOT_EXIST);
        }

        if (userList.size() > 1) {
            return ResultUtil.fail(ResponseCode.USER_EXIST_SAME);
        }
        return ResultUtil.success(convertToVo(userList));
    }

    private UserVo convertToVo(List<User> userList) {
        User user = userList.get(0);
        UserVo userVo = new UserVo();
        BeanUtils.copyProperties(user, userVo);
        userVo.setAccessToken(jwtProvider.generateAccessToken(JwtProvider.
                buildClaims(userVo.getUid(), "ADMIN", "ADMIN,USER"), userVo.getUsername()));
        return userVo;
    }

    @PostMapping("logout")
    public Result<UserVo> logout(String uid) {
        return ResultUtil.success(null);
    }


}

前端部分给axios配置了请求拦截器,会在头部带上JWT认证头信息

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import './plugins/element.js'
// 导入全局样式表
import './assets/css/global.css'
import './assets/font/iconfont.css'
import axios from 'axios'

// 配置请求根路径
axios.defaults.baseURL = 'http://localhost:8080/'
axios.interceptors.request.use(config => {
  if (config.url.indexOf('login') === -1) {
    config.headers.Authorization = window.sessionStorage.getItem('Authorization')
  }
  return config
})
Vue.prototype.$http = axios

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

除此之外,一般会事先进行一个基本的跨域配置,如下代码:

package xyz.yq56.sm.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * @author yiqiang
 */
@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedHeader("*");

        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
}

1.3 问题展示

以上代码登录接口都不会出现跨域问题,但是当请求普通接口(比如菜单接口)时,会出现跨域问题.
错误信息:

Access to XMLHttpRequest at xx from orgin xx has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

F12截图

在这里插入图片描述

在这里插入图片描述

2 解决方案

其实通过报错信息也能大概明白,是预检请求没有通过导致的报错,一般就是Option请求出错
搜索了半天,有人说加入如下配置即可解决

package xyz.yq56.sm.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;

/**
 ** 暂时没发现有什么用,先注释掉
 * @author yiqiang
 */
@Component
public class AccessCorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) response;
        res.addHeader("Access-Control-Allow-Credentials", "true");
        res.addHeader("Access-Control-Allow-Origin", "*");
        res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
        if (((HttpServletRequest) request).getMethod().equals(HttpMethod.OPTIONS.name())) {
            response.getWriter().println("ok");
            return;
        }
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig filterConfig) {
    }
}

先说结果,我尝试加入了如上配置,但是并没有什么卵用.这个只是加了个过滤器,你这里没给人家退回去,不代表别人不会退回去.
经过推敲,我认为是Spring Security可能也有相关的限制,于是我去搜索了Security的跨域配置,果然被我找到了requestMatchers(CorsUtils::isPreFlightRequest).permitAll()这个配置项.于是我修改了Security配置,如下:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors(AbstractHttpConfigurer::disable)
                .csrf(AbstractHttpConfigurer::disable)
                .sessionManagement(item -> item.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeRequests(req -> req
                        //非普通请求(比如请求新增了自定义头部信息,比如Jwt头),会发送预检Option请求,这里直接让他通过
                        .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
                        .antMatchers("/user/biz/login").permitAll()
                        .anyRequest().authenticated())
                .addFilterBefore(jwtSecurityFilter, UsernamePasswordAuthenticationFilter.class)
                .httpBasic(AbstractHttpConfigurer::disable)
        ;
    }

经验证,请求正常,改动生效
在这里插入图片描述

3 结论

如果项目中符合如下几点,可以尝试一下

  1. 项目中使用了Spring Security
  2. 前端跨域请求中携带了自定义的Header,比如Jwt等等
  3. 控制台报错: Access to XMLHttpRequest at xx from orgin xx has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
  4. 已配置常规跨域配置CorsFilter

以上几点均满足的话,请立刻尝试新增Spring Security配置.requestMatchers(CorsUtils::isPreFlightRequest).permitAll()

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors(AbstractHttpConfigurer::disable)
                .csrf(AbstractHttpConfigurer::disable)
                .sessionManagement(item -> item.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeRequests(req -> req
                        //非普通请求(比如请求新增了自定义头部信息,比如Jwt头),会发送预检Option请求,这里直接让他通过
                        .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
                        .antMatchers("/user/biz/login").permitAll()
                        .anyRequest().authenticated())
                .addFilterBefore(jwtSecurityFilter, UsernamePasswordAuthenticationFilter.class)
                .httpBasic(AbstractHttpConfigurer::disable)
        ;
    }

希望各位老大看到我这篇之后可以不用寻找下一篇博客.能帮到你们的话,麻烦帮忙点个赞或者评论一下,谢谢.

TP8 解决前后端跨域访问请求API接口办法 报错:Access to XMLHttpRequest at 'http://www.e.com/api/v1.index/index?实现目标:只要http://www.e.com/api/网址开关都充许跨域访问。1.1 创建app\middleware/CorsMiddle.php代码。1.2 修改route/app.php的代码。不要一个一个接口写,希望有一个通用方法。方法一:前端不允许跨域携带cookie。 阅读详情

相关推荐

spring boot项目实战:跨域问题解决

背景前后端分离架构,前端anglerjs,后端spring boot,使用shiro作为权限控制,已配置通用跨域请求支持。 前端调用接口时部分情况正常,部分情况出现跨域请求不支持情况,错误信息如下:Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' hea

思与学的博客 2595

关于跨域 Response to preflight request doesn‘t pass access control check

做项目的时候由于访问了不同的服务器,然后导致了跨域问题,报错情况为: has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: Redirect is not allowed for a preflight request。 从网上找了解决办法,也就是采用CORS方案,在要访问的跨域服务器上的返回页面加上标头: response.setHeader(“Access-Con

qq_39286701的博客 6万+

vmware vsphere 证书过期告警处理方法

vSphere Clinet 管理页面出现“证书告警” ,检查证书未发现现有证书有过期现象

m0_51902127的博客 3640

Response to preflight request doesn‘t pass access control check: Redirect is not allowed for a pref

Access to XMLHttpRequest at 'xxx' from origin 'http://localhost:8082' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: Redirect is not allowed for a preflight request. 1、后端已经解决了跨域问题 2、有些请求不会出现问题,单独一两个请求 解

weixin_46371752的博客 6909

深入MoveIt与OMPL集成开发:从源码编译到自定义规划算法实战

本文详细介绍了如何从源码编译集成MoveIt与OMPL,并实现自定义规划算法的完整流程。通过清理环境、获取源码、解决编译依赖与错误,最终指导开发者创建并集成名为MyRRT的自定义规划算法,从而实现对机器人运动规划栈的深度定制与优化。

h0i1j2k3l的博客 468

Linux之GTK系列教程

00、背上行囊1——程序员学习之道 01、背上行囊2——为什么要学习GTK 02、背上行囊3——GUI概述 03、背上行囊4——GTK简介 04、背上行囊5——GTK环境搭建( Linux ) 05、背上行囊6——GTK环境搭建( windows ) 06、踏上旅途1——一个简单的空白窗口 07、踏上旅途2——控件的添加 08、踏上旅途3——布局容器之水平布局 09、踏上旅途

每天积累一点点 2万+

跨域问题The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '...

withCredentials 属性 上面说到,CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发到服务器,一方面要服务器同意,指定Access-Control-Allow-Credentials字段。 出现这个报错信息很可能是你在前端设置了withCredentials = true;你可以去掉这个设置也可以参考下面两个博客 https://jue...

weixin_30337157的博客 4009

MATLAB实战:手把手教你实现WVD信号分析(附完整代码与避坑指南)

本文通过MATLAB实战,手把手教你实现Wigner-Ville分布(WVD)信号分析。文章提供了从零构建WVD函数的完整代码,并重点解析了使用解析信号、处理交叉项、优化计算效率等关键避坑指南,帮助工程师高效处理非平稳信号,获得高分辨率的时频分析结果。

purple的博客 1083

前端报错:Response to preflight request doesn‘t pass access control check: No ‘Access-Control-Allow-Origi

项目场景: 前端报错: Access to XMLHttpRequest at ’ http:// — ?id=5’ from origin ‘http:// —’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resou

Ashy- 在这里成长 2179

通俗讲解清楚光线追踪中的蒙特卡洛积分

彻底讲解光线追踪中的蒙特卡洛积分

qq_37366618的博客 1244

[STC32G144K246入门第一步]点亮LED

STC32G144K246是一款高性能32位8051单片机,集成了丰富外设资源,适用于工业控制和复杂算法处理。该芯片支持双模式内核,内置硬件加速器,提供246KB Flash和144KB SRAM存储空间。文章详细介绍了开发环境搭建步骤、寄存器配置方法,并给出了LED驱动示例代码,通过推挽输出控制P42口实现闪烁效果。虽然开发环境相比ARM存在不足,但通过合理配置仍可满足项目需求。该教程为开发者快速上手STC32G144K246提供了实用参考。

sinat_58149788的博客 800

Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' he

今天,在一个Spring Boot项目中遇到了跨域访问的问题。 通过查阅相关资料,可知可以在配置类上重写一个方法来实现跨域访问。 package com.jxufe.demotest.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.se...

qq_41700374的博客 1万+

labview高低拼接的理解

计算机的一个字节由8位组成,无符号的8位整形表示的范围为0~255,范围太小了,所以用双字节,即16位整形表示更大范围的数字0 ~65535。2.labview中的高低拼接实质是高8位字节左移8位与低8位字节相加,结果是双字节整形。

qwerqwerdhr的博客 839

SpringBoot跨域问题解决

根据资料显示,这个是因为浏览器预检请求失败,复杂请求会做预检请求,比如header中有自动以的属性等情况,当前的报错是指OPTION 请求失败,需要后端放行 OPTION 请求。经过一番百度之后,需要在控制器上添加处理跨域的注解,前端访问后台接口时,浏览器报错,跨域无法访问。然后将拦截器注册到全局拦截器中,使其生效。再次访问接口,请求正常返回了。

每天学习一点点 9958

十八万字《python从零到精通教程》第二版,贴心保姆教你从零变大神,学不会找我

文章目录一.pycharm下载安装二.python下载安装三.pycharm上配置python四.配置镜像源让你下载嗖嗖的快4.1pycharm内部配置4.2手动添加镜像源4.3永久配置镜像源五.插件安装(比如汉化?)5.1自动补码神器第一款5.2 自动补码神器第二款5.2汉化pycharm5.3其它插件六.美女背景七.自定义脚本开头八、这个前言一定要看九、python入门十、python缩进十一、Python注释1.单行注释2.多行注释十二、Python 变量1.变量定义理解2. 变量名命名3. 分配多个

全栈川川 7万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Response to preflight request doesn't pass access control check跨域问题,session不共享也同样

说明:这个异常是由于跨域而引起的 (你没有解决跨域的问题) 第一种:拦截器方式 第二种:注解方式 把下面这个注解,放在需要跨域的controller上面,需要的话,也可以配置一个过滤器,实现全局跨域 springboot 有 如果使用SSM 则需要把spring版本更新到4.2以上使用该注解 第三种:前端ajax请求方式增加header头信息 我这里就不弄了 还有一种...

baidu_37366055的博客 9087

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

解决跨域Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin

我前端使用的是Nuxt,后端是SpringBoot,还是用了Nginx反向代理服务器,经常出现跨域问题,但是后端Controller上有@CrossOrigin注解,所以后端没问题,前端接口也没有问题,那么问题就是出在Nginx上面,经过两天改Bug发现用一行代码可以解决 这是Nginx报的错 nginx: [error] CreateFile() "F:\nginx-1.16.1/logs/ng...

weixin_45657973的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

has been blocked by CORS policy: Response to preflight request doesn‘t pass access control check: N

CORS跨域问题 :8080/#/pages/loginRegist/loginRegist:1 Access to XMLHttpRequest at ‘http://127.0.0.1:8099/passport/getSMSCode?mobile=13812345678’ from origin ‘http://localhost:8080’ has been blocked by CORS policy: Response to preflight request doesn’t pass acce

miss_na的博客 2232

Sa-Token跨域问题解决方案与实战技巧

跨域资源共享(CORS)是Web开发中常见的安全机制,由浏览器的同源策略引发。其核心原理是通过预检请求(preflight)验证服务端是否允许跨域访问。在权限认证场景下,特别是使用Sa-Token这类框架时,跨域问题会变得更加复杂。合理的CORS配置需要兼顾安全性与功能性,涉及请求头处理、预检响应和凭证管理等关键技术点。本文以Sa-Token框架为例,详细解析如何在SpringBoot、过滤器和Nginx三个层级实现跨域支持,特别针对Authorization头暴露、OPTIONS请求处理和Cookie跨域

weixin_30617695的博客 361

Java请求跨域处理

Java请求跨域处理 参考 Access to XMLHttpRequest at ‘http://localhost:88/api/sys/login’ from origin ‘http://localhost:8001’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is

wangzibai的博客 1541

完美解决Springboot跨域(No 'Access-Control-Allow-Origin' header is present on the requested resource)

1.由于项目前后端分离,前段访问后端接口,出现:“Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource”; 2.解决办法:Applicatio如下启动类里面,添加配置,...

向着高亮的地方 1万+

【跨域】【axios】【SpringBoot】Vue使用axios请求添加请求头之后Response to preflight request doesn‘t pass XXXX

放行之后,重启项目就可以了,没有问题了。

博客 230

解决SpringBoot项目有关跨域的问题,内含其他博客中不生效的解决方法

(前言:此方法可以快速解决有关请求跨域时的问题,重点在最后,可直接跳过去看) 场景:在使用amis框架搭建好前端后,出现了前端发送post请求,后端无法接收的问题; 而在反复检查路径无误后,通过F12看到问题出在了跨域这里 错误信息为: Response to preflight request doesn t pass access control check: No Access-Control-Allow-Origin header is present on the requested re

weixin_52161359的博客 1527

Sa-Token跨域解决方案与CORS问题实战解析

跨域资源共享(CORS)是前后端分离架构中的常见挑战,其核心源于浏览器的同源策略安全机制。当涉及身份认证时,标准的Spring CORS配置可能失效,特别是处理OPTIONS预检请求时。作为Java生态流行的轻量级权限框架,Sa-Token在与Spring Security等组件集成时,需要特殊处理认证头(如sa-token)的跨域传递。本文通过对比三种典型方案:SpringBoot原生配置、Sa-Token专属过滤器和Nginx层处理,揭示不同场景下的最优解。针对微服务架构,特别强调Nginx统一管理的生

weixin_34238633的博客 506

Spring Boot跨域问题解决方案全解析

跨域资源共享(CORS)是浏览器安全机制的重要组成部分,它通过同源策略限制不同源之间的资源访问。其核心原理是通过HTTP头部字段进行权限控制,包括Access-Control-Allow-Origin等关键响应头。在Spring Boot开发中,处理跨域问题有多种技术方案,包括@CrossOrigin注解、WebMvcConfigurer全局配置、CorsFilter过滤器以及Nginx反向代理等。这些方案各有适用场景,开发者需要根据项目需求选择最合适的实现方式。特别是在微服务架构和前后端分离项目中,正确处

weixin_33730836的博客 683
上一篇: 代码编写过程中常遇到的坑,看完总会有所收获的
下一篇: Java构建树形菜单工具类,递归写法
一步一结
博客等级 码龄7年 50粉丝 65原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值