一、基于过滤器的CORS支持(Spring Boot项目)
Spring框架还提供了CorsFilter。在这种情况下,不用使用@CrossOrigin
或 WebMvcConfigurer#addCorsMappings(CorsRegistry)
,例如,可以在Spring Boot应用程序中声明如下的过滤器:
1package com.card.config;
2
3import org.springframework.context.annotation.Bean;
4import org.springframework.context.annotation.Configuration;
5import org.springframework.web.cors.CorsConfiguration;
6import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
7import org.springframework.web.filter.CorsFilter;
8
9/**10 * 跨域访问控制11 */
12@Configuration
13public class CorsConfig {
14 private CorsConfiguration buildConfig() {
15 CorsConfiguration corsConfiguration = new CorsConfiguration();
16 // 允许任何域名使用
17 corsConfiguration.addAllowedOrigin("*");
18 // 允许任何头
19 corsConfiguration.addAllowedHeader("*");
20 // 允许任何方法(post、get等)
21 corsConfiguration.addAllowedMethod("*");
22 return corsConfiguration;
23 }
24
25
26 @Bean
27 public CorsFilter corsFilter() {
28 UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
29 // 对接口配置跨域设置
30 source.registerCorsConfiguration("/**", buildConfig());
31 return new CorsFilter(source);
32 }
33}
二、Nginx方式
1.下载Nginx(推荐1.18.0)
1https://nginx.org/en/download.html
2.配置Nginx,编辑 nginx-1.18.0\conf\nginx.conf
把默认的server配置注释掉
1server{
2 listen 80;
3 server_name localhost;
4
5 location /{
6 proxy_pass http://192.168.0.76:8005/;
7 }
8
9 location /ssns-serve{
10 proxy_pass http://localhost:8080;
11 }
12 }
上面代码的意思是将localhost:80
转发为192.168.0.76:8005
,也就是说现在访问localhost:80
实际上是访问192.168.0.76:8005
,而访问localhost:80/ssns-serve
则是访问localhost:8080
,并以ssns-serve
开头的url
三、跨域(CORS)支持:
Spring Framework 4.2 GA为CORS提供了第一类支持,使您比通常的基于过滤器的解决方案更容易和更强大地配置它。所以springMVC的版本要在4.2或以上版本才支持@CrossOrigin
1、controller配置CORS
1.1.controller方法的CORS配置,您可以向@RequestMapping注解处理程序方法添加一个@CrossOrigin注解,以便启用CORS(默认情况下,@CrossOrigin允许在@RequestMapping注解中指定的所有源和HTTP方法)
1@RestController
2@RequestMapping("/account")
3public class AccountController {
4 @CrossOrigin
5 @GetMapping("/{id}")
6 public Account retrieve(@PathVariable Long id) { // ...
7 }
8 @DeleteMapping("/{id}")
9 public void remove(@PathVariable Long id) { // ...
10 }
11}
其中@CrossOrigin中的2个参数:origins:允许可访问的域列表maxAge:准备响应前的缓存持续的最大时间(以秒为单位)
1.2.为整个controller启用@CrossOrigin
1@CrossOrigin(origins = "http://baidu.com", maxAge = 3600)
2@RestController
3@RequestMapping("/account")
4public class AccountController {
5 @GetMapping("/{id}")
6 public Account retrieve(@PathVariable Long id) { // ...
7 }
8 @DeleteMapping("/{id}")
9 public void remove(@PathVariable Long id) { // ...
10 }
11}
1.3.同时使用controller和方法级别的CORS配置,Spring将合并两个注释属性以创建合并的CORS配置
1@CrossOrigin(maxAge = 3600)
2@RestController
3@RequestMapping("/account")
4public class AccountController {
5 @CrossOrigin(origins = "http://baidu.com")
6 @GetMapping("/{id}")
7 public Account retrieve(@PathVariable Long id) { // ...
8 }
9 @DeleteMapping("/{id}")
10 public void remove(@PathVariable Long id) { // ...
11 }
12}
1.4.如果您正在使用Spring Security,请确保在Spring安全级别启用CORS,并允许它利用Spring MVC级别定义的配置
1@EnableWebSecurity
2public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
3 @Override
4 protected void configure(HttpSecurity http) throws Exception {
5 http.cors().and()...
6 }
7}
2、全局CORS配置
除了细粒度、基于注释的配置之外,您还可能需要定义一些全局CORS配置。这类似于使用筛选器,但可以声明为Spring MVC并结合细粒度@CrossOrigin配置。默认情况下,所有origins and GET, HEAD and POST methods是允许的
JavaConfig
使整个应用程序的CORS简化为:
1@Configuration
2@EnableWebMvc
3public class WebConfig extends WebMvcConfigurerAdapter {
4 @Override
5 public void addCorsMappings(CorsRegistry registry) {
6 registry.addMapping("/**");
7 }
8}
如果您正在使用Spring Boot,建议将WebMvcConfigurer bean声明如下:
1@Configuration
2public class MyConfiguration {
3 @Bean
4 public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() {
5 @Override
6 public void addCorsMappings(CorsRegistry registry) {
7 registry.addMapping("/**");
8 }
9 };
10 }
11}
您可以轻松地更改任何属性,以及仅将此CORS配置应用到特定的路径模式:
1@Override
2public void addCorsMappings(CorsRegistry registry) {
3 registry.addMapping("/api/**")
4 .allowedOrigins("http://baidu.com")
5 .allowedMethods("PUT", "DELETE")
6 .allowedHeaders("header1", "header2", "header3")
7 .exposedHeaders("header1", "header2")
8 .allowCredentials(false).maxAge(3600);
9}
如果您正在使用Spring Security,请确保在Spring安全级别启用CORS,并允许它利用Spring MVC级别定义的配置
PS:Spring注解@CrossOrigin不起作用的原因
1、是springMVC的版本要在4.2或以上版本才支持@CrossOrigin
2、非@CrossOrigin没有解决跨域请求问题,而是不正确的请求导致无法得到预期的响应,导致浏览器端提示跨域问题
3、在Controller注解上方添加@CrossOrigin注解后,仍然出现跨域问题,解决方案之一就是:
在@RequestMapping注解中没有指定Get、Post方式,具体指定后,问题解决
代码如下:
1@CrossOrigin
2@RestController
3public class person{
4 @RequestMapping(method = RequestMethod.GET)
5 public String add() { // ...
6 }
7}
微信公众号科技猫回复数字:228 获取精选Java面试题
这里是科技猫,我们下期见!