博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring/Spring MVC/Spring Boot实现跨域
阅读量:7231 次
发布时间:2019-06-29

本文共 4800 字,大约阅读时间需要 16 分钟。

说明:Spring MVC和Spring Boot其实用的都是同一套。

CORS介绍请看这里:

在WEB项目中,如果我们想支持CORS,一般都要通过过滤器进行实现,可以定义一些基本的规则,但是不方便提供更细粒度的配置,如果你想参考过滤器实现,你可以阅读下面这篇文章:

Spring MVC从4.2版本开始增加了对CORS的支持

在Spring MVC中增加CORS支持非常简单,可以配置全局的规则,也可以使用@CrossOrigin注解进行细粒度的配置。

使用@CrossOrigin注解

先通过源码看看该注解支持的属性:

@Target({ ElementType.METHOD, ElementType.TYPE })  @Retention(RetentionPolicy.RUNTIME)  @Documented  public @interface CrossOrigin {        String[] DEFAULT_ORIGINS = { "*" };        String[] DEFAULT_ALLOWED_HEADERS = { "*" };        boolean DEFAULT_ALLOW_CREDENTIALS = true;        long DEFAULT_MAX_AGE = 1800;          /**      * 同origins属性一样      */      @AliasFor("origins")      String[] value() default {};        /**      * 所有支持域的集合,例如"http://domain1.com"。      * 

这些值都显示在请求头中的Access-Control-Allow-Origin * "*"代表所有域的请求都支持 *

如果没有定义,所有请求的域都支持 * @see #value */ @AliasFor("value") String[] origins() default {}; /** * 允许请求头重的header,默认都支持 */ String[] allowedHeaders() default {}; /** * 响应头中允许访问的header,默认为空 */ String[] exposedHeaders() default {}; /** * 请求支持的方法,例如"{RequestMethod.GET, RequestMethod.POST}"}。 * 默认支持RequestMapping中设置的方法 */ RequestMethod[] methods() default {}; /** * 是否允许cookie随请求发送,使用时必须指定具体的域 */ String allowCredentials() default ""; /** * 预请求的结果的有效期,默认30分钟 */ long maxAge() default -1; }  

如果你对这些属性的含义不是很明白,建议阅读下面的文章了解更多:

下面举例在方法和Controller上使用该注解

@CrossOrigin注解的配置:

@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)  @RestController  @RequestMapping("/account")  public class AccountController {        @RequestMapping("/{id}")      public Account retrieve(@PathVariable Long id) {          // ...      }        @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")      public void remove(@PathVariable Long id) {          // ...      }  }

这里指定当前的AccountController中所有的方法可以处理http://domain2.com域上的请求,

在方法上使用@CrossOrigin注解:

@CrossOrigin(maxAge = 3600)  @RestController  @RequestMapping("/account")  public class AccountController {        @CrossOrigin("http://domain2.com")      @RequestMapping("/{id}")      public Account retrieve(@PathVariable Long id) {          // ...      }        @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")      public void remove(@PathVariable Long id) {          // ...      }  }

在这个例子中,AccountController类上也有@CrossOrigin注解,retrieve方法上也有注解,Spring会合并两个注解的属性一起使用。

CORS全局配置,除了细粒度基于注解的配置,你可能会想定义一些全局CORS的配置。这类似于使用过滤器,但可以在Spring MVC中声明,并结合细粒度@CrossOrigin配置。默认情况下所有的域名和GET、HEAD和POST方法都是允许的。

Spring Boot的配置:

如果使用Spring Boot,可以通过这种方式方便的进行配置。看下面例子:

@Configuration  @EnableWebMvc  public class WebConfig extends WebMvcConfigurerAdapter {        @Override      public void addCorsMappings(CorsRegistry registry) {          registry.addMapping("/**");      }  }

可以轻松地更改任何属性,以及配置适用于特定的路径模式的CORS:

@Configuration  @EnableWebMvc  public class WebConfig extends WebMvcConfigurerAdapter {        @Override      public void addCorsMappings(CorsRegistry registry) {          registry.addMapping("/api/**")              .allowedOrigins("http://domain2.com")              .allowedMethods("PUT", "DELETE")              .allowedHeaders("header1", "header2", "header3")              .exposedHeaders("header1", "header2")              .allowCredentials(false).maxAge(3600);      }  }

Spring MVC中基于XML的配置:

这个配置和上面Java方式的第一种作用一样。

同样,可以做更复杂的配置:

Access-Control-Allow-Origin: *:表示来允许任何站点对该资源进行跨域请求

在Spring MVC下的解决方案:

定义CORSFilter

import java.io.IOException;  import javax.servlet.Filter;  import javax.servlet.FilterChain;  import javax.servlet.FilterConfig;  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 {    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {      HttpServletResponse response = (HttpServletResponse) res;      response.setHeader("Access-Control-Allow-Origin", "*");      response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");      response.setHeader("Access-Control-Max-Age", "3600");      response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");      chain.doFilter(req, res);    }    public void init(FilterConfig filterConfig) {}    public void destroy() {}  }

web.xml:

cors
com.web.filter.CORSFilter
cors
/*

 

参考:

(以上内容转自此篇文章)

==>如有问题,请联系我:easonjim#163.com,或者下方发表评论。<==

转载地址:http://ncvfm.baihongyu.com/

你可能感兴趣的文章
xdebug php 运行效率分析工具
查看>>
在laravel框架中使用ajax请求报错419
查看>>
shell用法 (cat << EOF)
查看>>
Shell脚本实现在Linux系统中自动安装JDK
查看>>
chrome浏览器新建标签打开页面【学习笔记】
查看>>
基于ET框架和UGUI的简单UI框架实现(转)
查看>>
es6的模块化;js的模块化
查看>>
显示所有环境变量:env 或者 printenv
查看>>
程序员也需要的软技能,既为了生存,也为了早日财务自由
查看>>
No toolchains found in the NDK toolchains folder for ABI with prefix
查看>>
Java中可变长参数的使用及注意事项
查看>>
lucene源码分析(4)Similarity相似度算法
查看>>
LESS+to+MCSS
查看>>
ASP.NET CORE 中用单元测试测试控制器
查看>>
2018入门微单相机推荐
查看>>
ORA-00020: maximum number of processes (xxxx) exceeded 报错解决方法
查看>>
Jmeter之csv参数化
查看>>
J2EE程序员应该要掌握的linux知识
查看>>
MySQL中select * for update锁表的范围
查看>>
Python与Microsoft Office自动化操作
查看>>