SpringSecurity-2.7中跨域问题解析

 更新时间:2024年01月06日 09:46:53   作者:itl-coder.github.io  
这篇文章主要介绍了SpringSecurity-2.7中跨域问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

SpringSecurity-2.7中跨域问题

访问测试

起因

写这篇的起因是会了解到 SSM(@CrosOrigin)解决跨域,但是会在加入SpringSecurity配置后,这个跨域解决方案就失效了,而/login这个请求上是无法添加这个注解或者通过配置(WebMvcConfig)去解决跨域,所以只能使用SpringSecurity提供的.cros()去解决跨域,但是在学习过程中,如果稍微粗心,可能会出现跨域不通的问题,而以下将会说明SpringSecurity是如何配置跨域的

Postman发起的请求不属于异步请求(区分前后端分离的JSON)

使用axios发起异步请求,

<!-- 
	前端: 使用 Live Server 启动访问 http://127.0.0.1:5500/index.html
 	后端: localhost:8080/login 
 -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <button id="btn">发起异步请求</button>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <script>
      let btnEl = document.querySelector('#btn');
      btnEl.onclick = function () {
        console.log('click......................');
        axios({
          url: 'http://localhost:8080/login',
          method: 'post',
          data: {
            username: 'zhangsan',
            password: '123456',
          },
        }).then((res) => {
          console.log(res);
        });
      };
    </script>
  </body>
</html>

请求测试

SpringSecurity-配置

config

// 【/login】需要显示的声明出来,在前后端分离中,本文没有采用的是 ajax 向后端发送异步请求 
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    /**
     * 请求配置
     * authorizeHttpRequests: 开启权限请求管理,针对 http 请求进行授权配置
     * mvcMatchers: 匹配请求
     * - permitAll: 代表放行该资源,该资源位公共资源,无需认证和授权可以直接访问
     * - anyRequest().authenticated(): 代表所有请求,必须认证之后才能访问
     * - formLogin: 代表开启表单认证
     * <strong>放行资源必须放在认证资源之前</strong>
     */
    http.authorizeHttpRequests((authorizeHttpRequests) ->
            authorizeHttpRequests
                    // 预检请求是怎么知道的:官网中有这样一段描述,如图
                    .antMatchers(HttpMethod.OPTIONS, "/login").permitAll()
                    .anyRequest().authenticated()
    );
 /**
  * 跨域配置
  */
 http.cors().configurationSource(corsConfigurationSource());
// WHITELIST 自定义的放行资源数组, /login不能出现在里面
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
    return (web) -> web.ignoring().antMatchers(WHITELIST);
}
}
// 此处关于下方的描述可以不更改,依然使用此配置
@Bean
CorsConfigurationSource corsConfigurationSource() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); // 新建一个跨域配置源
    // 你只要点击 .cors().configurationSource( <- 点击进入这个方法,查看出这个参数,就明白为什么给了 CorsConfiguration,)
    CorsConfiguration configuration = new CorsConfiguration(); // 新建一个跨域配置
    configuration.setAllowCredentials(true); // 【这个凭证问题,后续会给出详细解释,在 axios 的配置中默认是false,【axios 中 `withCredentials` 表示跨域请求时是否需要使用凭证】浏览器是否应当发送凭证信息,如cookie。
    configuration.setAllowedMethods(Arrays.asList("*")); // 允许的请求方法,*表示允许所有方法
    configuration.setAllowedHeaders(Arrays.asList("*")); // 允许的请求头,*表示允许所有头
    configuration.setMaxAge(Duration.ofHours(1)); // 预检请求的有效期,有效期内不必再次发送,默认是1800秒。
    configuration.setAllowedOriginPatterns(Arrays.asList("*"));// 允许的请求源
    source.registerCorsConfiguration("/**", configuration); // 注册跨域配置
    return source;
}

以上配置其实可以算正确,但是有合规

在调试后发现,只需要将/login加入(.antMatchers("/login").permitAll()),在所看到的视频中的关于SpringSecurity的跨域就生效了,也可以不将预检配置出来

到此这篇关于SpringSecurity-2.7中跨域问题的文章就介绍到这了,更多相关SpringSecurity跨域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java基础之Integer使用的注意事项及面试题

    Java基础之Integer使用的注意事项及面试题

    这篇文章主要给大家介绍了关于Java基础之Integer使用注意事项及面试题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • Java Web开发常用框架Spring MVC Struts示例解析

    Java Web开发常用框架Spring MVC Struts示例解析

    这篇文章主要为大家介绍了Java Web开发常用框架Spring MVC Struts示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Json字符串与Object、List、Map的互转工具类

    Json字符串与Object、List、Map的互转工具类

    今天小编就为大家分享一篇关于Json字符串与Object、List、Map的互转工具类,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • java -jar命令及SpringBoot通过java -jav启动项目的过程

    java -jar命令及SpringBoot通过java -jav启动项目的过程

    本篇文章将为大家讲述关于 SpringBoot 项目工程完成后,是如何通过 java-jar 命令来启动的,以及介绍 java-jar 命令的详细内容,对SpringBoot java -jav启动过程感兴趣的朋友跟随小编一起看看吧
    2023-05-05
  • SpringBoot统计接口调用耗时的三种方式

    SpringBoot统计接口调用耗时的三种方式

    在实际开发中,了解项目中接口的响应时间是必不可少的事情,SpringBoot 项目支持监听接口的功能也不止一个,接下来我们分别以 AOP、ApplicationListener、Tomcat 三个方面去实现三种不同的监听接口响应时间的操作,需要的朋友可以参考下
    2024-06-06
  • elasticsearch集群查询超10000的解决方案

    elasticsearch集群查询超10000的解决方案

    ES为了避免用户的过大分页请求造成ES服务所在机器内存溢出,默认对深度分页的条数进行了限制,默认的最大条数是10000条,这篇文章主要给大家介绍了关于elasticsearch集群查询超10000的解决方案,需要的朋友可以参考下
    2024-08-08
  • 使用java实现百万级别数据导出excel的三种方式

    使用java实现百万级别数据导出excel的三种方式

    这篇文章主要介绍了使用java实现百万级别数据导出excel的三种方式,有些业务系统可能动辄涉及到百万上千万的数据,用正常的方法效率就变得很低,今天我们来看看这几种实现思路
    2023-03-03
  • 十分钟理解Java中的动态代理

    十分钟理解Java中的动态代理

    十分钟帮助大家理解Java中的动态代理,什么是动态代理?感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Java数组添加元素的两种方法

    Java数组添加元素的两种方法

    这篇文章主要介绍了Java数组添加元素的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友跟着小编来一起学习学习吧
    2023-04-04
  • springboot中Controller内文件上传到本地及阿里云操作方法

    springboot中Controller内文件上传到本地及阿里云操作方法

    这篇文章主要介绍了springboot中Controller内文件上传到本地及阿里云操作方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-12-12

最新评论