SpringBoot设置跨域请求

本文介绍了现代浏览器中的跨域问题及解决方案,包括JSONP、代理机制和CORS协议,并提供了配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现代浏览器处于安全的考虑,在http/https请求时必须遵守同源策略,否则即使跨域的http/https 请求,默认情况下是被禁止的,ip(域名)不同、或者端口不同、协议不同(比如http、https) 都会造成跨域问题。

一、 前端解决方案 
1. 使用 JSONP 来支持跨域的请求,JSONP 实现跨域请求的原理简单的说,就是动态创建 
script 标签,然后利用 script 的 SRC 不受同源策略约束来跨域获取数据。缺点是需 
要后端配合输出特定的返回信息。 
2. 利用反应代理的机制来解决跨域的问题,前端请求的时候先将请求发送到同源地址的后 
端,通过后端请求转发来避免跨域的访问。

后来 HTML5 支持了 CORS 协议。CORS 是一个 W3C 标准,全称是”跨域资源共享”(Cross-origin resource sharing),允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制。它通过服务器增加一个特殊的 Header[Access-Control-Allow-Origin]来告诉客户端跨域的限制,如果浏览器支持 CORS、并且判断 Origin 通过的话,就会允许 XMLHttpRequest 发起跨域请求。

三种配置方式:

  1. 配置 过滤器
    @Configuration
    public class GlobalCorsConfig {
        @Bean
        public CorsFilter corsFilter() {
            CorsConfiguration config = new CorsConfiguration();
              config.addAllowedOrigin("*");
              config.setAllowCredentials(true);
              config.addAllowedMethod("*");
              config.addAllowedHeader("*");
              config.addExposedHeader("*");
    
            UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
            configSource.registerCorsConfiguration("/**", config);
    
            return new CorsFilter(configSource);
        }
    }

     

  2. 配置拦截器
    @Configuration
    public class MyConfiguration extends WebMvcConfigurerAdapter  {
    
        @Override  
        public void addCorsMappings(CorsRegistry registry) {  
            registry.addMapping("/**")  
                    .allowCredentials(true)  
                    .allowedHeaders("*")  
                    .allowedOrigins("*")  
                    .allowedMethods("*");  
    
        }  
    }
    

     

  3. 单个请求
    @RequestMapping("/hello")
    @CrossOrigin("http://localhost:8080") 
    public String hello( ){
    return "Hello World";
    }

     

### Spring Boot 中请求的配置方法 #### 使用过滤器方式全局配置 一种常见的解决问题的方法是通过创建自定义过滤器并将其注册到应用中。这种方式可以为整个应用程序设置统一的策略[^1]。 ```java import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; @Component public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException { HttpServletResponse response = (HttpServletResponse) res; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization"); try { chain.doFilter(req, res); } catch(Exception e){ throw new ServletException(e.getMessage()); } } } ``` 上述代码展示了如何通过 `CorsFilter` 类实现支持,其中设置了允许的源 (`*`)、HTTP 方法以及头部字段等内容。 --- #### 利用 WebMvcConfigurer 接口进行配置 另一种常用的方式是通过实现 `WebMvcConfigurer` 接口来完成配置。这种方法更加灵活,适合需要针对特定路径或控制器单独设定规则的情况[^4]。 ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") // 对 /api/ 下的所有接口生效 .allowedOrigins("*") // 允许任何名发起请求 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 支持的 HTTP 请求方法 .maxAge(3600) // 预检请求缓存时间(秒) .allowedHeaders("Content-Type", "Authorization"); // 允许携带的 Header 字段 } } ``` 此示例说明了如何利用 `addCorsMappings` 方法指定哪些 URL 模式适用规则,并明确了具体的参数范围。 --- #### 基于注解的局部配置 如果只需要对某些特定的 Controller 或 Method 进行控制,则可以直接使用 `@CrossOrigin` 注解[^2]。 ```java import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/example") @CrossOrigin(origins = "http://localhost:8080", allowedHeaders = "*", methods = {RequestMethod.GET}) public class ExampleController { @GetMapping("/data") public String getData() { return "This is cross-origin data."; } } ``` 这里展示了一个简单的例子,在 `ExampleController` 上添加了 `@CrossOrigin` 注解以限定其仅接受来自 `http://localhost:8080` 的请求。 --- #### 结合配置类导入机制 为了确保配置能够被正确加载,可以通过在主程序入口处加入 `@Import` 注解引入专门负责逻辑的配置文件[^3]。 ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Import; @SpringBootApplication @Import(CorsConfig.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这里的 `CorsConfig` 即为之前提到过的某个实现了功能的具体配置类实例。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值