SpringBoot解决跨域方式

跨域是指在 Web 应用中,一个服务器资源或应用访问另一个服务器资源或应用的资源时候。由于浏览器的同源策略,一般情况下同一个域中的网站或应用可以互相访问资源,但跨域访问会被浏览器拒绝。

浏览器出于安全考虑,会限制跨域访问,就是不允许跨域请求资源,要求协议,IP和端口必须都相同,其中有一个不同就会产生跨域问题,这就是同源策略。

跨域的产生原因包括:

1、不同的域名:同一个网站或应用如果使用不同的域名,则会产生跨域。
不同的协议:如果两个网站或应用使用的协议不同(如 HTTP 和 HTTPS),也会产生跨域。
2、不同的端口:同一个域名,如果使用不同的端口号,也会产生跨域。

请求方(前端)相应方(服务器)是否跨域原因
http://www.jshuai.comhttp://www.jshuai.com/test.html协议,域名,端口号相同
http://www.jshuai.comhttps://www.jshuai.com/test.html协议不相同
http://www.jshuai.comhttp://www.jshuainihao.com/test.html域名不相同
http://www.jshuai.comhttp://www.jshuai.com/test.html主域名相同子域名不相同
http://www.jshuai.com:8080http://www.jshuai.com:8081/test.html端口号不相同

在这里插入图片描述

解决方案:

JSONP:
JSONP 是一种前端的解决方案虽然也能解决跨域问题,但是有局限性。他只能解决get方式的请求,不支持其他请求。
CORS:
CORS(Cross-Origin Resource Sharing)是一种服务端跨域解决方案,通过在 HTTP 头中添加特殊的 Access-Control-* 字段,允许浏览器进行跨域访问。

CORS解决方案:

(1)、第一种通过注解:
在接口层或者在其接口层方法上面添加一个注解 @CrossOrigin但是,有局限性。
@RestController
@CrossOrigin(origins="http://localhost:8081")//并在注解中指明哪一个前端的地址域名。也可以 "*" 代表所有
public class CorsController {
    @GetMapping("/getcors")
    public  String hello(){
        return "hello cors";
  
        每一个接口都得配,比较有局限性,不推荐。
(2)、添加跨域配置类:
@Configuration
public class GlobalCorsCorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        //1. 添加 CORS配置信息
        CorsConfiguration config = new CorsConfiguration();
        //放行哪些原始域
        config.addAllowedOriginPattern("*");//SpringBoot2.4.0后的写法
       // config.addAllowedOrigin("*");
        //是否发送 Cookie
        config.setAllowCredentials(true);
        //放行哪些请求方式
        config.addAllowedMethod("*");
        //放行哪些原始请求头部信息
        config.addAllowedHeader("*");
        //暴露哪些头部信息
        config.addExposedHeader("*");
        //2. 添加映射路径
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**",config);
        //3. 返回新的CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }
}

(3)、实现WebMvcConfigurer接口:(推荐)
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")//哪些接口允许他跨域, "/**" 代表所有。
                //是否发送Cookie
                .allowCredentials(true)
                .allowedorigins("http://localhost:8081")//哪些域名允许他跨域, "/**" 代表所有。
                .allowedHeaders("*")//哪些请求头允许他跨域
            	.allowedMethods("*")//允许方法
                .Maxage("设置时间");//有效时间
        /**
        	有效时间的作用: 比方说送 put 的请求,首先浏览器会发送一个叫探测请求的东西,这个探测请求会发送到服务器上面。看服务器是否支持这个 Put 的请求,支         持才会发起 Put请求。这样我们可以给这个 put 请求设置一个有效时间,如果在规定的有效时间内再次发送put请求就不用再发送这个探测请求的东西了 
        */
        
            
    }
}

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值