Spring Boot 中三种跨域场景总结,这篇必看,阿里P8亲自教你

首先创建两个普通的 Spring Boot 项目,这个就不用我多说,第一个命名为 provider 提供服务,第二个命名为 consumer 消费服务,第一个配置端口为 8080,第二个配置配置为 8081,然后在 provider 上提供两个 hello 接口,一个 get,一个 post,如下:


@RestController

public class HelloController {

    @GetMapping("/hello")

    public String hello() {

        return "hello";

    }

    @PostMapping("/hello")

    public String hello2() {

        return "post hello";

    }

} 

在 consumer 的 resources/static 目录下创建一个 html 文件,发送一个简单的 ajax 请求,如下:


<div id="app"></div>

<input type="button" onclick="btnClick()" value="get_button">

<input type="button" onclick="btnClick2()" value="post_button">

<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> 

然后分别启动两个项目,发送请求按钮,观察浏览器控制台如下:


Access to XMLHttpRequest at 'http://localhost:8080/hello' from origin 'http://localhost:8081' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. 

可以看到,由于同源策略的限制,请求无法发送成功。

使用 CORS 可以在前端代码不做任何修改的情况下,实现跨域,那么接下来看看在 provider 中如何配置。首先可以通过 @CrossOrigin 注解配置某一个方法接受某一个域的请求,如下:


@RestController

public class HelloController {

    @CrossOrigin(value = "http://localhost:8081")

    @GetMapping("/hello")

    public String hello() {

        return "hello";

    }



    @CrossOrigin(value = "http://localhost:8081")

    @PostMapping("/hello")

    public String hello2() {

        return "post hello";

    }

} 

这个注解表示这两个接口接受来自 http://localhost:8081 地址的请求,配置完成后,重启 provider ,再次发送请求,浏览器控制台就不会报错了,consumer 也能拿到数据了。

此时观察浏览器请求网络控制台,可以看到响应头中多了如下信息:

在这里插入图片描述

这个表示服务端愿意接收来自 http://localhost:8081 的请求,拿到这个信息后,浏览器就不会再去限制本次请求的跨域了。

provider 上,每一个方法上都去加注解未免太麻烦了,有的小伙伴想到可以讲注解直接加在 Controller 上,不过每个 Controller 都要加还是麻烦,在 Spring Boot 中,还可以通过全局配置一次性解决这个问题,全局配置只需要在 SpringMVC 的配置类中重写 addCorsMappings 方法即可,如下:


@Configuration

public class WebMvcConfig implements WebMvcConfigurer {

    @Override

    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/**")

        .allowedOrigins("http://localhost:8081")

        .allowedMethods("*")

        .allowedHeaders("*");

    }

} 

/** 表示本应用的所有方法都会去处理跨域请求,allowedMethods 表示允许通过的请求数,allowedHeaders 则表示允许的请求头。经过这样的配置之后,就不必在每个方法上单独配置跨域了。

2.1 存在的问题

了解了整个 CORS 的工作过程之后,我们通过 Ajax 发送跨域请求,虽然用户体验提高了,但是也有潜在的威胁存在,常见的就是 CSRF(Cross-site request forgery)跨站请求伪造。跨站请求伪造也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF,是一种挟制用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法。

3.SpringSecurity

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

当引入了 Spring Security 的时候,我们有两种办法开启 Spring Security 对跨域的支持。

3.1 方式一

方式一就是在上一小节的基础上,添加 Spring Security 对于 CORS 的支持,只需要添加如下配置即可:


@Configuration

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override

    protected void configure(HttpSecurity http) throws Exception {

        http

                .authorizeRequests()

                .anyRequest().authenticated()

                .and()

                .formLogin()

                .permitAll()

                .and()

                .httpBasic()

                .and()

                .cors()

                .and()

                .csrf()

                .disable();

    }

} 

一个 .cors 就开启了 Spring Security 对 CORS 的支持。

3.2 方式二

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


@Configuration

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override

    protected void configure(HttpSecurity http) throws Exception {

        http

                .authorizeRequests()

                .anyRequest().authenticated()

                .and()

                .formLogin()

                .permitAll()

                .and()

                .httpBasic()

                .and()



# 最后

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份**限量版的Java零基础宝典**能够对你有所帮助。

领取这份**Java零基础宝典**,**[只需要点击这里即可免费下载](https://gitee.com/vip204888/java-p7)**

![](https://img-blog.csdnimg.cn/img_convert/8aa110ff656e0797ad67bebdfab38a6a.png)

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。

如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份**限量版的Java零基础宝典**能够对你有所帮助。

领取这份**Java零基础宝典**,**[只需要点击这里即可免费下载](https://gitee.com/vip204888/java-p7)**

[外链图片转存中...(img-BfJQWlaT-1628589162425)]

![](https://img-blog.csdnimg.cn/img_convert/6f48e39f279720a93602928e293d9b73.png)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值