SpringBoot解决跨域方式

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。SpringBoot解决跨域方式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

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

跨域的产生原因包括:

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

请求方(前端) 相应方(服务器) 是否跨域 原因
http://www.jshuai.com http://www.jshuai.com/test.html 协议,域名,端口号相同
http://www.jshuai.com https://www.jshuai.com/test.html 协议不相同
http://www.jshuai.com http://www.jshuainihao.com/test.html 域名不相同
http://www.jshuai.com http://www.jshuai.com/test.html 主域名相同子域名不相同
http://www.jshuai.com:8080 http://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请求就不用再发送这个探测请求的东西了 
        */
        
            
    }
}

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/188565.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!