网易首页 > 网易号 > 正文 申请入驻

Spring Security系列教程解决Spring Security环境中的跨域问题

0
分享至

原创:千锋一一哥

前言

上一章节中,一一哥 给各位讲解了同源策略和跨域问题,以及跨域问题的解决方案,在本篇文章中,我会带大家进行代码实现,看看在Spring Security环境中如何解决跨域问题。

一. 启用Spring Security 的CORS支持

1. 创建web接口

我先在SpringBoot环境中,创建一个端口号为8080的web项目,注意这个web项目没有引入Spring Security的依赖包。然后在其中创建一个IndexController,定义两个测试接口以便被ajax进行跨域访问。8080项目的代码结构:

@RestController
public class IndexController {
@GetMapping("/hello")
public String hello() {
return "get hello";
}
@PostMapping("/hello")
public String hello2() {
return "post hello";
}
}

请参考如下代码结构进行项目创建。

2. 执行ajax请求

我们接下来再创建另一个端口号为8082的web项目,注意这个web项目也没有引入Spring Security的依赖包。接着在这里定义一个index.html页面,利用ajax跨域访问8080项目中的web接口。

8082项目的代码结构:

请参考如下代码结构进行项目创建。

3. 发起跨域请求

我们访问8082项目中的index.html页面,然后分别执行get与post请求,这时候就可以在浏览器的控制台上看到产生了CORS跨域问题,出现了CORS error状态,在请求头中出现了Referer Policy: strict-origin-when-cross-origin。

4. 解决跨域问题

既然现在产生了跨域问题,那么该怎么解决呢?其实我们可以采用如下两种方式之一来解决跨域问题。

方式1:在接口方法上利用@CrossOrigin注解解决跨域问题

@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";
}
}

方式2:通过实现WebMvcConfigurer接口来解决跨域问题

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:8082")
.allowedMethods("*")
.allowedHeaders("*");
}
}

当进行了跨域设置之后,我们再次进行跨域请求,就可以看到请求成功了。

二. Spring Security环境下的跨域问题解决

1. 引入Spring Security依赖

通过上面的配置,我们已经解决了Ajax的跨域请求问题,但是这个案例中也有潜在的威胁存在,常见的就是 CSRF(Cross-site request forgery) 跨站请求伪造。跨站请求伪造也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF,是一种用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法。

所以为了提高网站的安全性,我在上面Spring Boot项目的基础之上,添加Spring Security的依赖包,但是暂时不进行任何别的操作。

2. 重启8080项目进行测试

接着我就重启8080这个Spring Boot项目,然后在8082项目中再次进行跨域请求,我们会发现在引入Spring Security后,再次产生了跨域问题。

3. 解决Spring Security环境下跨域问题的3种方案

通过实验可知,如果使用了 Spring Security,上面的跨域配置会失效,因为请求会被 Spring Security 拦截。那么在Spring Security环境中,如何解决跨域问题呢?这里我们有3种方式可以开启 Spring Security 对跨域的支持。

3.1 方式一:开启cors方法

我们在上面的案例之上,编写一个SecurityConfig配置类,在configure方法中,利用cors() 开启Spring Security 对 CORS 的支持:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.permitAll()
.and()
.formLogin()
.permitAll()
.and()
.httpBasic()
.and()
//支持跨域访问
.cors()
.and()
.csrf()
.disable();
}
}

3.2 方式二:进行全局配置

第二种方式是去除上面的跨域配置,直接在 Spring Security 中做全局配置,如下:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.permitAll()
.and()
.formLogin()
.permitAll()
.and()
.httpBasic()
.and()
//支持跨域访问
.cors()
.configurationSource(corsConfigurationSource())
.and()
.csrf()
.disable();
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowCredentials(true);
configuration.setAllowedOrigins(Collections.singletonList("*"));
configuration.setAllowedMethods(Collections.singletonList("*"));
configuration.setAllowedHeaders(Collections.singletonList("*"));
configuration.setMaxAge(Duration.ofHours(1));
source.registerCorsConfiguration("/**", configuration);
return source;
}
}

以上2个方法,都可以实现在Spring Security环境下的跨域访问。

3.3 方式三:支持OAuth2的跨域访问

我们开发时,还有一种情况就是支持 OAuth2 相关接口的跨域,比如用户要访问 OAuth2 中的 /oauth/token 等接口。我们可以配置一个全局的 CorsFilter 跨域过滤器类,核心代码如下:

/**
* 跨域配置方式3:定义全局跨域过滤器
**/
@Configuration
public class GlobalCorsConfiguration {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.setAllowCredentials(true);
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//跨域方式3:
http.requestMatchers()
.antMatchers(HttpMethod.OPTIONS, "/oauth/**")
.and()
.csrf()
.disable()
.formLogin()
.and()
.cors();
}
}

该方式也可以实现Spring Security中的跨域访问。

4. 代码结构

以下是本案例的代码结构,可以参考下图进行项目创建:

至此,我就带各位解决了Spring Security环境中的跨域问题,你学会了吗?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
不打了!MVP附加赛报销!全联盟最贵的毒药合同

不打了!MVP附加赛报销!全联盟最贵的毒药合同

篮球实战宝典
2026-04-14 15:30:22
威少:直到赛季开始前两天我才确定有工作 我心怀感激

威少:直到赛季开始前两天我才确定有工作 我心怀感激

北青网-北京青年报
2026-04-14 20:00:02
打了45天血战才明白!伊朗最大的敌人并不是美以,而是这些身边人

打了45天血战才明白!伊朗最大的敌人并不是美以,而是这些身边人

顾史
2026-04-15 10:29:52
6天后油价大降,92汽油涨超1.8元/升后180°反转,下次4月21日调价

6天后油价大降,92汽油涨超1.8元/升后180°反转,下次4月21日调价

猪友巴巴
2026-04-15 09:25:19
从周一见到周一不见:文章面馆闭店日冲上热搜,有些事永远过不去

从周一见到周一不见:文章面馆闭店日冲上热搜,有些事永远过不去

非常先生看娱乐
2026-04-15 10:38:10
调整!4月15日晚间央视直播CBA有变,上海、辽宁、广厦、深圳出战

调整!4月15日晚间央视直播CBA有变,上海、辽宁、广厦、深圳出战

小李说球赛
2026-04-15 12:40:38
格林35+5,太阳110-114不敌开拓者!谁是输球罪魁?数据给出答案

格林35+5,太阳110-114不敌开拓者!谁是输球罪魁?数据给出答案

小火箭爱体育
2026-04-15 13:11:29
字字扎心!王晓晨发文内涵俞灏明,五年付出全都白费,压根没看上

字字扎心!王晓晨发文内涵俞灏明,五年付出全都白费,压根没看上

仙味少女心
2026-04-14 12:57:06
“祭品”许家印

“祭品”许家印

海涛评论
2026-04-14 21:54:33
日本全面叫停种植牙?种牙潜藏的风险与后遗症,一次为你讲明白

日本全面叫停种植牙?种牙潜藏的风险与后遗症,一次为你讲明白

垚垚分享健康
2026-04-11 08:51:57
2400多万伊朗人志愿为国献身

2400多万伊朗人志愿为国献身

澎湃新闻
2026-04-15 03:00:05
妻子出轨被捉现行,丈夫默许妻子的行为,2019年情夫还想杀死丈夫

妻子出轨被捉现行,丈夫默许妻子的行为,2019年情夫还想杀死丈夫

汉史趣闻
2026-04-15 08:10:51
蒋介石私生活有多混乱?贴身秘书晚年才敢说破,宋美龄的做法绝了

蒋介石私生活有多混乱?贴身秘书晚年才敢说破,宋美龄的做法绝了

芊芊子吟
2026-04-12 21:20:03
2.4万亿元,一个人怎么能闯出这么大的祸…

2.4万亿元,一个人怎么能闯出这么大的祸…

葱哥说
2026-04-14 22:04:16
暴跌!价格几乎腰斩!一女子连吃两天,剧烈腹痛胃底被堵死!很多人爱吃

暴跌!价格几乎腰斩!一女子连吃两天,剧烈腹痛胃底被堵死!很多人爱吃

南方都市报
2026-04-13 16:44:33
可乐再次被关注!医生发现:高血压者喝可乐,不用多久或有6变化

可乐再次被关注!医生发现:高血压者喝可乐,不用多久或有6变化

荆医生科普
2026-04-14 15:08:47
建设方急用钱,他花85万元买5套“工抵房”,领钥匙装修时开发商称多支付工程款不给交房

建设方急用钱,他花85万元买5套“工抵房”,领钥匙装修时开发商称多支付工程款不给交房

大风新闻
2026-04-15 11:36:05
小流氓遇见大流氓,美国正式封锁霍尔木兹海峡

小流氓遇见大流氓,美国正式封锁霍尔木兹海峡

海子侃生活
2026-04-14 10:10:15
马斯克再放狠话:能建造出比中国任何公共交通系统,都更好的系统

马斯克再放狠话:能建造出比中国任何公共交通系统,都更好的系统

刘森森
2026-04-15 13:25:05
欧尔班团队被匈牙利新总理指控叛国!并正在销毁证据

欧尔班团队被匈牙利新总理指控叛国!并正在销毁证据

项鹏飞
2026-04-14 17:39:47
2026-04-15 15:15:00
千锋武汉
千锋武汉
做真实的自己,用良心做教育
2115文章数 85关注度
往期回顾 全部

科技要闻

手机无死角上网?亚马逊砸百亿硬刚马斯克

头条要闻

浙江61岁男子持长矛杀邻居后自首 被判死刑立即执行

头条要闻

浙江61岁男子持长矛杀邻居后自首 被判死刑立即执行

体育要闻

三球准绝杀戴大金链:轰30+10自我救赎

娱乐要闻

曾志伟办73岁生日派对,逾百艺人到场

财经要闻

业绩失速的Lululemon:"健康"人设崩塌?

汽车要闻

海豹08内饰首秀 大满配“海王”旗舰

态度原创

教育
亲子
本地
数码
公开课

教育要闻

超实用!公共俄语四级解题思路,3层渗透法直接套用!

亲子要闻

amh值0.9还能自然怀孕吗?试管促排期间不能吃哪些食物?

本地新闻

12吨巧克力有难,全网化身超级侦探添乱

数码要闻

微软最终放弃了其巨大的 Surface Hub 触屏显示器

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版