SpringSecurity5(11-跨域配置)

news/2025/3/30 20:09:42/文章来源:https://www.cnblogs.com/penggx/p/18792750

SpringBoot跨域处理

@CrossOrigin(局部跨域)

  1. 作用在方法上
@RestController
public class IndexController {@CrossOrigin(value = "http://localhost:8082")@GetMapping("/hello")public String hello() {return "get hello";}@CrossOrigin(value = "http://localhost:8082")@PostMapping("/hello")public String hello2() {return "post hello";}
}
  1. 作用在类上
@CrossOrigin(origins = "http://example.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {@RequestMapping(method = RequestMethod.GET, path = "/{id}")public Account retrieve(@PathVariable Long id) {// ...}@RequestMapping(method = RequestMethod.DELETE, path = "/{id}")public void remove(@PathVariable Long id) {// ...}
}

WebMvcConfigurer(全局跨域)

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedHeaders("Content-Type","X-Requested-With","accept,Origin","Access-Control-Request-Method","Access-Control-Request-Headers","token").allowedMethods("*").allowedOrigins("*").allowCredentials(true);}
}

SpringSecurity跨域处理

跨域配置详解

如果使用了 Spring Security,上面的跨域配置会失效,因为请求被 Spring Security 拦截了

在项目中使用 Spring Security,我们必须采取额外的步骤确保它与 CORS 协作良好。这是因为 CORS 需要首先处理,否则,Spring Security 会在请求到达 Spring MVC 之前将其拒绝

@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.cors().and()...}
}

可以配置 CORS 以覆盖默认的 Spring Security CORS 处理器。为此,我们需要添加一个 CorsConfigurationSource Bean,使用 CorsConfiguration 实例来处理 CORS 配置。如果添加了 CorsFilter Bean,http.cors() 方法就会使用 CorsFilter,否则就会使用 CorsConfigurationSource。如果两者都未配置,则使用 Spring MVC pattern inspector handler。

public class CorsConfigurer<H extends HttpSecurityBuilder<H>>extends AbstractHttpConfigurer<CorsConfigurer<H>, H> {private static final String HANDLER_MAPPING_INTROSPECTOR = "org.springframework.web.servlet.handler.HandlerMappingIntrospector";private static final String CORS_CONFIGURATION_SOURCE_BEAN_NAME = "corsConfigurationSource";private static final String CORS_FILTER_BEAN_NAME = "corsFilter";private CorsConfigurationSource configurationSource;public CorsConfigurer() {}public CorsConfigurer<H> configurationSource(CorsConfigurationSource configurationSource) {this.configurationSource = configurationSource;return this;}@Overridepublic void configure(H http) {ApplicationContext context = http.getSharedObject(ApplicationContext.class);CorsFilter corsFilter = getCorsFilter(context);if (corsFilter == null) {throw new IllegalStateException("Please configure either a " + CORS_FILTER_BEAN_NAME + " bean or a "+ CORS_CONFIGURATION_SOURCE_BEAN_NAME + "bean.");}http.addFilter(corsFilter);}private CorsFilter getCorsFilter(ApplicationContext context) {if (this.configurationSource != null) {return new CorsFilter(this.configurationSource);}// 查找是否有名为corsFilter的Bean对象boolean containsCorsFilter = context.containsBeanDefinition(CORS_FILTER_BEAN_NAME);if (containsCorsFilter) {return context.getBean(CORS_FILTER_BEAN_NAME, CorsFilter.class);}// 查找是否有名为corsConfigurationSource的Bean对象boolean containsCorsSource = context.containsBean(CORS_CONFIGURATION_SOURCE_BEAN_NAME);if (containsCorsSource) {CorsConfigurationSource configurationSource = context.getBean(CORS_CONFIGURATION_SOURCE_BEAN_NAME, CorsConfigurationSource.class);return new CorsFilter(configurationSource);}// 查找是否有org.springframework.web.servlet.handler.HandlerMappingIntrospector该类boolean mvcPresent = ClassUtils.isPresent(HANDLER_MAPPING_INTROSPECTOR,context.getClassLoader());if (mvcPresent) {return MvcCorsFilter.getMvcCorsFilter(context);}return null;}static class MvcCorsFilter {private static final String HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME = "mvcHandlerMappingIntrospector";private static CorsFilter getMvcCorsFilter(ApplicationContext context) {if (!context.containsBean(HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME)) {throw new NoSuchBeanDefinitionException(HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME, "A Bean named " + HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME +" of type " + HandlerMappingIntrospector.class.getName()+ " is required to use MvcRequestMatcher. Please ensure Spring Security & Spring MVC are configured in a shared ApplicationContext.");}// 获取名为mvcHandlerMappingIntrospector的Bean对象HandlerMappingIntrospector mappingIntrospector = context.getBean(HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME, HandlerMappingIntrospector.class);return new CorsFilter(mappingIntrospector);}}
}

CorsConfigurationSource(全局跨域)

@Configuration
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().permitAll().and().formLogin().permitAll().and().httpBasic().and()// 支持跨域访问.cors()// 可以选择配置//.configurationSource(corsConfigurationSource()).and().csrf().disable();}@Beanpublic CorsConfigurationSource corsConfigurationSource() {CorsConfiguration configuration = new CorsConfiguration();configuration.setAllowedOrigins(Arrays.asList("*"));configuration.setAllowedMethods(Arrays.asList("*"));configuration.setAllowedHeaders(Arrays.asList("*"));UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", configuration);return source;}
}

CosFilter(全局跨域)

还有一种情况就是支持 OAuth2 相关接口的跨域,比如用户要访问 OAuth2 中的 /oauth/token 等接口,可以配置一个全局的 CorsFilter 跨域过滤器类

@Configuration
public class GlobalCorsConfig {@Beanpublic CorsFilter corsFilter() {//1.添加CORS配置信息CorsConfiguration config = new CorsConfiguration();//放行哪些原始域config.addAllowedOrigin("*");//是否发送Cookie信息config.setAllowCredentials(true);//放行哪些原始域(请求方式)config.addAllowedMethod("*");//放行哪些原始域(头部信息)config.addAllowedHeader("*");//暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)config.addExposedHeader("*");//2.添加映射路径UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();configSource.registerCorsConfiguration("/**", config);//3.返回新的CorsFilter.return new CorsFilter(configSource);}
}

自定义Filter(全局跨域)

public class CorsFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {String orignalHeader = StringUtils.defaultIfBlank(request.getHeader("Origin"), "*");// 指定本次预检请求的有效期response.setHeader("Access-Control-Max-Age", "3600");// 服务器支持的所有头信息字段response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));response.setHeader("Access-Control-Allow-Origin", orignalHeader);response.setHeader("Access-Control-Allow-Credentials", "true");response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");filterChain.doFilter(request, response);}
}
@Configuration
public class WebMvcConfig extends WebSecurityConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.addFilterBefore(new CorsFilter(), WebAsyncManagerIntegrationFilter.class);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/906054.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型危机-多维对抗时代的网络安全与隐私困局

文章学习笔记:AI大模型危机-多维对抗时代的网络安全与隐私困局AI发展引发的安全风险与日俱增,加剧了网络安全形式的复杂性。本文剖析了大模型全生命周期安全威胁图谱,揭示数据资源枯竭、隐私泄露、监管滞后等风险问题。 AI大模型驱动网络安全风险”多维裂变“ AI大模型的发展…

CB2401是一款高性能、低功耗可完美替代RFX2401C/AT2401C

CB2401是一款高性能、低功耗的2.4GHz射频前端集成电路(RFIC),专为蓝牙、Zigbee和2.4GHz专有协议无线应用设计。该芯片可完美替代RFX2401C和AT2401C,提供更优的性能和更低的功耗。 主要技术参数核心优势 更高发射功率:+22dBm输出功率,比竞品高出2dB,通信距离更远 更低功耗:…

CH341 Linux驱动 设备驱动连接后又自动关闭

1.uname -r 查看linux版本号2.选择合适内核下的驱动 https://elixir.bootlin.com/linux/v6.8/source/drivers/usb/serial/ch341.c 3.make & make install 4.发现/dev下没有ttyUSB0设备 5.dmesg 发现问题 6043.015612] usb 1-4.2: ch341-uart converter now attached to tty…

会计学-现金流表(三)

介绍 什么是现金流量表?:就是反映你当前现金状况的一个表。 由四个部分构成:期初现金 + 本期流入现金 - 本期流出现金 = 期末现金一个企业或者一个家庭很多时候,即使是落入资不抵债的局面,也未必就会陷入破产,只要他的现金流可以一直维持日常运转,就可以不需要被迫去变卖…

会计学-资产负债表(二)

介绍 什么是资产负债表?:反映的是一家公司或者是一个家庭在某一时刻体量的表。 公式是:资产 = 负债 + 所有者权益。 资产负债表分成左右两栏,左边是资产,右边是负债和权益。 资产表示你的家底有多厚,负债和权益表示这些家底是从哪里来的。会计学上的资产负债表比较复杂的…

王炸!Kafka 4.0 重磅发布,Java 8 和 Zookeeper 彻底被抛弃了,一个时代结束了!

大家好,我是R哥。 Kafka 4.0 终于来了!这次更新可不只是常规的版本优化,而是一次重大架构调整,尤其是不再支持 Java 8,彻底移除了 Zookeeper,正式启用 KRaft 模式,让 Kafka 变得更加独立、高效。 除了这个重磅更新外,Kafka 4.0 还砍掉了一些历史包袱,还带来几个重磅新…

会计学-开篇(一)

介绍 是不是觉得会计学极其枯燥,死板,无趣?因为会计准则本身就是人为设定的游戏规则,整个学习过程感觉就是一直在背诵各种条条框框,完全没有创造性。相比之下,不管是数学,编程,物理学,生物学,投资学,都显得很有意思,这些学科都是帮助我们通向创造。而会计学似乎只会…

会计学-开篇

介绍 是不是觉得会计学极其枯燥,死板,无趣?因为会计准则本身就是人为设定的游戏规则,整个学习过程感觉就是一直在背诵各种条条框框,完全没有创造性。相比之下,不管是数学,编程,物理学,生物学,投资学,都显得很有意思,这些学科都是帮助我们通向创造。而会计学似乎只会…

2 小时,我搭好了“一物一码” 的设备巡检管理系统!

说实话,以前每次看到设备巡检表上那些手写的记录,我就头疼——字迹潦草、容易丢、查起来还费劲。直到昨天下午,我实在忍不了了,决定自己动手搞个"一物一码"的巡检系统。 从零到落地,现在所有设备贴个二维码,手机一扫就能查记录、报故障,还能自动生成报表! 老…

2022-PTA正式赛-L1-8 静静的推荐(思路)

未达到分数线passAcCode: #include<bits/stdc++.h> using namespace std; int vis[100010]; int main(){int N, K, S, ans = 0;cin >> N >> K >> S;while(N--){int sc1, sc2;cin >> sc1 >> sc2;if(sc1 < 175) continue;if(sc1 >= 17…

GlusterFS 三节点集群部署指南(Heketi 管理模式)

前言:随着信息技术的飞速发展,数据量呈爆炸式增长,传统的集中式存储系统已经难以满足现代应用对存储容量、性能和可靠性的苛刻需求。分布式存储技术应运而生,而 GlusterFS 作为其中的杰出代表,凭借其简单却强大的架构设计,成为了存储领域的一颗新星。 GlusterFS 的魅力不…