首页 > 其他分享 >SpringBoot如何解决跨域问题

SpringBoot如何解决跨域问题

时间:2023-07-18 14:23:53浏览次数:35  
标签:SpringBoot 实现 put 解决 new config public 跨域

什么是跨域

跨域问题的本质是浏览器为了保证用户的一种安全拦截机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。

跨域三种情况
在发起请求时,如果出现了以下情况中的任意一种,那么它就是跨域请求:

  1. 协议不同,如 http 和 https;

  2. 域名不同;

  3. 端口不同。

也就是说,即使域名相同,如果一个使用的是 http,另一个使用的是 https,那么它们也属于跨域访问。

想要解决跨域问题,只需要告诉浏览器“我是自己人,不要拦我”就行。它的常见实现方式有以下 5 种。

解决方案1:使用 @CrossOrigin 注解实现跨域

@RestController
@CrossOrigin(origins = "*")
public class TestController {
    @RequestMapping("/test")
    public HashMap<String, Object> test() {
        return new HashMap<String, Object>() {{
            put("state", 200);
            put("data", "success");
            put("msg", "");
        }};
    }
}

使用此方式只能实现局部跨域,当一个项目中存在多个类的话,使用此方式就会比较麻烦(需要给所有类上都添加此注解)。

解决方案2:通过配置文件实现跨域

实现全局跨域,实现步骤如下:

@Configuration // 一定不要忽略此注解
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 所有接口
                .allowCredentials(true) // 是否发送 Cookie
                .allowedOriginPatterns("*") // 支持域
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"}) // 支持方法
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

解决方案3:通过 CorsFilter 对象实现跨域

此实现方式和上一种实现方式类似,它也可以实现全局跨域,它的具体实现代码如下:

@Configuration // 一定不能忽略此注解
public class MyCorsFilter {
    @Bean
    public CorsFilter corsFilter() {
        // 1.创建 CORS 配置对象
        CorsConfiguration config = new CorsConfiguration();
        // 支持域
        config.addAllowedOriginPattern("*");
        // 是否发送 Cookie
        config.setAllowCredentials(true);
        // 支持请求方式
        config.addAllowedMethod("*");
        // 允许的原始请求头部信息
        config.addAllowedHeader("*");
        // 暴露的头部信息
        config.addExposedHeader("*");
        // 2.添加地址映射
        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**", config);
        // 3.返回 CorsFilter 对象
        return new CorsFilter(corsConfigurationSource);
    }
}

解决方案4:通过 Response 对象实现跨域

此方式是解决跨域问题最原始的方式,但它可以支持任意的 Spring Boot 版本(早期的 Spring Boot 版本也是支持的)。但此方式也是局部跨域,它应用的范围最小,设置的是方法级别的跨域,它的具体实现代码如下:

@RestController
public class TestController {
    @RequestMapping("/test")
    public HashMap<String, Object> test(HttpServletResponse response) {
        // 设置跨域
        response.setHeader("Access-Control-Allow-Origin", "*");
        return new HashMap<String, Object>() {{
            put("state", 200);
            put("data", "success");
            put("msg", "");
        }};
    }
}

解决方案5:通过实现 ResponseBodyAdvice 实现跨域

通过重写 ResponseBodyAdvice 接口中的 beforeBodyWrite(返回之前重写)方法,我们可以对所有的接口进行跨域设置,它的具体实现代码如下:

@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {
    /**
     * 内容是否需要重写(通过此方法可以选择性部分控制器和方法进行重写)
     * 返回 true 表示重写
     */
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }
    /**
     * 方法返回之前调用此方法
     */
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
                                  Class selectedConverterType, ServerHttpRequest request,
                                  ServerHttpResponse response) {
        // 设置跨域
        response.getHeaders().set("Access-Control-Allow-Origin", "*");
        return body;
    }
}

标签:SpringBoot,实现,put,解决,new,config,public,跨域
From: https://www.cnblogs.com/zhaojinhui/p/17562815.html

相关文章

  • @NacosConfigListener注解监听配置变化失效解决
    项目初始配置:maven依赖如下:<!--配置与发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency&g......
  • 面试官:一个 SpringBoot 项目能处理多少请求?(小心有坑)
    你好呀,我是歪歪。这篇文章带大家盘一个读者遇到的面试题哈。根据读者转述,面试官的原问题就是:一个SpringBoot项目能同时处理多少请求?不知道你听到这个问题之后的第一反应是什么。我大概知道他要问的是哪个方向,但是对于这种只有一句话的面试题,我的第一反应是:会不会有坑?所以并......
  • SpringBoot启动类变灰色,无法启动,注解通通不生效
    1:自己准备创建SpringBoot项目时,严格按照要求创建后,变成了这样。启动类运行不了,@SpringBootApplication注解也是黑色。而正常的是蓝色,注解是黄色。2:通过查询博主java文件夹标记为sourcesroot目录,右上角选择蓝色框框,然后选择Modules,最后把java、resources、test分别配置好。 ......
  • GIS中按掩膜提取后栅格颜色错误的解决办法
    在GIS中对landsat8卫星图像进行按掩膜提取操作时,发现提取后即使是合成波段正确图像颜色也是错误的,类似下图:  排查错误后发现不是波段的问题,而是拉伸的问题,可以在符号系统—RGB合成—拉伸选项中将原有的“百分比截断”选项修改为“标准差”选项,按照需要调整n值,能够得到裁剪......
  • 导入大文件数据库报错500怎么解决?
    我们在数据库导入大文件的数据库时,会报错HTTP500InternalServerError的错误,HTTP500InternalServerError通常表示服务器无法处理请求,这有很多原因导致,下面我们来分析下可能的原因和解决方法。1、数据库文件过大:可以采用软件或第三方数据库管理工具导入,可以解决数据库文件......
  • 解决 Https 站点请求 Http 接口服务后报 the content must be served over HTTPS 错误
    问题分析之前将自己所有的Http站点全部更新为Https站点,但是在请求后台接口服务的时候还是Http请求,导致部署之后,直接在控制台报Thisrequesthasbeenblocked;thecontentmustbeservedoverHTTPS;的错误解决思路因为我不想耗费精力,将所有的后台接口服务也更新为支......
  • windows 安装telnet(含疑难杂症解决)
    一、常规安装办法常规遇到telnet不是内部或外部命令,表明telnet还未安装,安装即可。操作步骤:Win+R打开控制面板:输入control-程序和功能-启用或关闭Windows功能-勾选Telnet客户端一般以上步骤可以打开telnet二、还是无法使用......
  • SpringBoot官方笔记4Web
    Mostwebapplicationsusethe spring-boot-starter-web moduletogetupandrunningquickly.Youcanalsochoosetobuildreactivewebapplicationsbyusingthe spring-boot-starter-webflux module.ServletWebApplicationsSpringWebMVCFrameworkimportja......
  • SpringBoot官方笔记3核心
    SpringApplicationBydefault, INFO loggingmessagesareshown,includingsomerelevantstartupdetails,suchastheuserthatlaunchedtheapplication.LazyInitializationWhenlazyinitializationisenabled,beansarecreatedastheyareneededratherth......
  • SpringBoot官方笔记7IO
    CachingSpringBootauto-configuresthecacheinfrastructureaslongascachingsupportisenabledbyusingthe @EnableCaching annotation.importorg.springframework.cache.annotation.Cacheable;importorg.springframework.stereotype.Component;@Component......