原创:千锋一一哥

前言

上一章节中,一一哥 给各位讲解了同源策略和跨域问题,以及跨域问题的解决方案,在本篇文章中,我会带大家进行代码实现,看看在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项目的代码结构:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Index</title><script type="text/javascript" src="jquery-2.1.0.js"></script></head><body><div id="app"></div><input type="button" onclick="btnClick()" value="get请求"><input type="button" onclick="btnClick2()" value="post请求"><script>function btnClick() {$.get('http://localhost:8080/hello', function (msg) {$("#app").html(msg);});}function btnClick2() {$.post('http://localhost:8080/hello', function (msg) {$("#app").html(msg);});}</script></body></html> 

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

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的依赖包,但是暂时不进行任何别的操作。

  <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency></dependencies>

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环境中的跨域问题,你学会了吗?

本文来自千锋教育,转载请注明出处。

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

  1. 爆破专栏丨Spring系列教程解决Spring Security环境中的跨域问题

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

  2. Vue---vue-cli 中的proxyTable解决开发环境中的跨域问题

    Vue---vue-cli 中的proxyTable解决开发环境中的跨域问题 参考文章: (1)Vue---vue-cli 中的proxyTable解决开发环境中的跨域问题 (2)https://ww ...

  3. 解决Django Rest Framework中的跨域问题

    解决Django Rest Framework中的跨域问题 参考文章: (1)解决Django Rest Framework中的跨域问题 (2)https://www.cnblogs.com/qicu ...

  4. 千锋教育威哥学Java——爆破专栏丨Spring Security系列教程之解决Spring Security环境中的跨域问题

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

  5. Spring Security系列教程03--创建SpringSecurity项目

    前言 在上一章节中,一一哥 已经带大家认识了Spring Security,对其基本概念已有所了解,但是作为一个合格的程序员,最关键的肯定还是得动起手来,所以从本篇文章开始,我就带大家搭建第一个Spr ...

  6. freemarker ftl模板_Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

    今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...

  7. 详解vue项目和普通项目如何解决开发环境与生产环境下的跨域问题

    概念: 什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制.所谓同源是指,域名,协议,端口均相同. http://www ...

  8. 微信公众号开发系列教程一(调试环境部署)

    http://www.cnblogs.com/zskbll/p/4074855.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...

  9. 微信公众号开发系列教程一(调试环境部署续:vs远程调试)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

最新文章

  1. gatsby_将您的GraphCMS数据导入Gatsby
  2. 分布式系统性能监控工具,初探Pinpoint Agent启动源码
  3. java 应用连接oracle 超级慢的解决方法
  4. 气候变迁给社会带来什么变化?
  5. 开头和结尾标记 在不同系统_写人作文的写作技巧。含思维导图、开头结尾写法及范文分析...
  6. linux下elasticsearch的安装
  7. 40 CO配置-控制-产品成本控制-成本对象控制-实际成本核算/物料分类帐-维护材料分类帐文档的编号范围
  8. 求逆元的两种方法+求逆元的O(n)递推算法
  9. Maven_Build_Resources
  10. 查看Linux下端口占用情况的命令
  11. HTML+CSS制作漂浮的对话框
  12. Django MySQL 多用户_Django 框架之 同时使用多个数据库
  13. iMazing2注册机如何备份苹果手机的通话记录?
  14. ZOC7 for Mac破解版激活方法附注册码
  15. 如何安装Bodymovin插件
  16. 官方示例之地球模块五:ThingLayer
  17. 一线明星纷纷失业,数据告诉你今年的演员有多难
  18. 石头科技:研发实力和过硬品质 助力扫地机器人产业升级
  19. CSS布局示例 1 - 页面色块布局
  20. 盘点 2021 年十大网络安全事件

热门文章

  1. 又为写作思路熬到秃头?这16篇最新论文打包送你
  2. 玩转Eureka+Ribbon系列之Ribbon的负载均衡策略
  3. 使用Objects判断对象是否为空,并返回对应信息
  4. 2021年 第13届 全国大学生数学竞赛 初赛(非数学类)试题详细解答
  5. JavaWeb-综合案例(用户信息)-学习笔记01【列表查询】
  6. 2016年 第07届 蓝桥杯 Java B组 决赛真题详解及小结
  7. Typora 快捷键
  8. Java08-day08【API(概述、使用)、String-StringBuilder(概述、构造方法、特点、方法)、StringBuilder和String相互转化】
  9. Android复习05【网络编程---WebView获取文章信息、保存用户名与密码、设置菜单样式、收藏文章列表】
  10. Java连接MySQL数据库 报错