spring security 如何解决跨域的

admin2024-09-06  28

一、什么是 CORS

关键字:同源 代表  协议 + ip + 端口 一致

 

二、跨域现象演示

spring security 如何解决跨域的,2ca2afe5579849ba801ba681833687ea.png,第1张

我们需要新建一个工程,启动本地的 localhost:8081  然后再启动一个工程端口在 8082在8082的工程中的 html页面发起一个ajax请求

2.1 后端代码

 步骤:创建一个基本的springweb工程,新建一个普通的controller

2.1.1 pom.xml 文件

<dependencies>
        <!-- web 支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- thymeleaf 模板 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

    </dependencies>

2.1.2 新建controller

@Controller
public class HomeController {



    @RequestMapping("/")
    public String index() {
        return "index";
    }


    @RequestMapping("/testHello")
    @ResponseBody
    public String testHello() {
        System.out.println("test Hello");
        return "test Hello ";
    }

}

2.1.3 新建index.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script th:src="@{https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js}" type="text/javascript"></script>
</head>
<body>


   <h2> spring cors web</h2>


<script>
    axios.get('/testHello')

</script>

</body>
</html>

2.1.4 当本机访问后查看结果

spring security 如何解决跨域的,a625587e065048beb667eb88d2901d4f.png,第2张

2.1.5 我们用HBuilder 打开这个文件

spring security 如何解决跨域的,7c61ce3a867d41e1b9f5e749dbfdb146.png,第3张


 

 

三、spring web 处理策略

3.1 @CrossOrigin 注解

该注解可以放到类和方法上,当放到类上面时,这个类下面所有的方法都生效

spring security 如何解决跨域的,2665eb13b6954e5bb290961e6879b60b.png,第4张

3.1.1 当我们加上后再来测试


 @CrossOrigin(origins = {"*"})
    @RequestMapping("/testHello")
    @ResponseBody
    public String testHello() {
        System.out.println("test Hello");
        return "test Hello ";
}

我们看到这个时候可以正常输出了

spring security 如何解决跨域的,d8f4dbc5c7d54d8888ed066929226252.png,第5张

 

3.2 使用WebMvcConfigurer 重写addCorsMappings配置

@Configuration
public class WebConfiguration implements WebMvcConfigurer {


    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")//处理所有请求
                .allowCredentials(false)
                .allowedMethods("*")
                .allowedOrigins("*")
                .allowedHeaders("*")
                .exposedHeaders("*")
                .maxAge(3600);

    }
}

3.2.1 测试结果

  我们注释掉方法上面的//@CrossOrigin(origins = {"*"})

spring security 如何解决跨域的,99ed18205e174827b7b08f66b2a6717d.png,第6张

 

3.3 使用CrosFilter

@Bean
    public FilterRegistrationBean<CorsFilter> corsFilter() {
        FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<>();
        CorsConfiguration configuration = new CorsConfiguration();

        configuration.setAllowCredentials(false);
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        configuration.setAllowedOriginPatterns(Arrays.asList("*"));
        configuration.setMaxAge(3600L);

        UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
        urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", configuration);

        registrationBean.setFilter(new CorsFilter(urlBasedCorsConfigurationSource));
        registrationBean.setOrder(-1);

        return registrationBean;

    }

测试同样可以达到效果

 

 


四、spring security 处理方案

4.1 导入security 依赖

<!-- SpringSecurity依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

spring security 如何解决跨域的,bfa1e5802ec647df916b36d6836838b5.png,第7张

我们看到又跨域请求又出现了,我们该怎么解决呢?

 

4.2  过滤器顺序

spring security 如何解决跨域的,cc0032c409ce4cf584e20b7f2019fc78.png,第8张

 

4.3 解决方案

  Spring security 为我们提供了更优秀的解决方案

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .and()
                .cors()
                .configurationSource(configurationSource()) //处理跨域请求
                .and()
                .csrf().disable();
    }


    /**
     *  配置spring security 跨域解决方案
     * @return
     */
    public CorsConfigurationSource configurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowCredentials(false);
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        configuration.setAllowedOriginPatterns(Arrays.asList("*"));
        configuration.setMaxAge(3600L);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);

        return source;
    }

spring security 如何解决跨域的,609b6ecfc5cb46779137054d904ba8b9.png,第9张

 

4.3.1 查看效果

spring security 如何解决跨域的,ca1a3bb86192459f949603d4bc2467a4.png,第10张

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!