# 《Spring核心技术》第59章-跨域访问:深度解析@CrossOrigin注解

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码地址:https://github.com/binghe001/spring-annotation-book/tree/master/spring-annotation-chapter-59 (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~


  • 本章难度:★★★★☆

  • 本章重点:进一步学习并掌握@CrossOrigin注解的案例和流程,从源码级别彻底掌握@CrossOrigin注解在Spring底层的执行流程。


本章目录如下所示:

  • 学习指引
  • 注解说明
    • 注解源码
    • 使用场景
  • 使用案例
  • 源码时序图
    • 启动程序
    • 请求链接
  • 源码解析
    • 启动程序
    • 请求链接
  • 总结
  • 思考
  • VIP服务

# 一、学习指引

Spring中的@CrossOrigin注解,你真的彻底了解过吗?

@CrossOrigin注解能够解决跨域问题,所谓跨域就是请求不在同一个域名下。一个典型的场景就是:在前后端分离的场景下,前端部署在binghe001.com域名下,要去访问binghe002.com域名下的图片等资源,就会出现跨域问题。这种跨域问题,如果不对这种跨域问题进行处理,访问过程就会报错。Spring中提供的@CrossOrigin注解就能够解决访问过程中的跨域问题。

# 二、注解说明

关于@CrossOrigin注解的一点点说明~~

@CrossOrigin注解是Spring中专门提供的一个用于处理跨域请求的注解,本节,就对@CrossOrigin注解的源码和使用场景进行简单的介绍。

# 2.1 注解源码

@CrossOrigin注解的源码详见:org.springframework.web.bind.annotation.CrossOrigin。

/**
 * @author Russell Allen
 * @author Sebastien Deleuze
 * @author Sam Brannen
 * @author Ruslan Akhundov
 * @since 4.2
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {
	@AliasFor("origins")
	String[] value() default {};
	@AliasFor("value")
	String[] origins() default {};

	/**
	 * @since 5.3
	 */
	String[] originPatterns() default {};
	String[] allowedHeaders() default {};
	String[] exposedHeaders() default {};
	RequestMethod[] methods() default {};
	String allowCredentials() default "";
	long maxAge() default -1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

从源码可以看出,@CrossOrigin注解是从Spring4.2版本开始提供的注解,可以标注到类上,也可以标注到方法上。在@CrossOrigin注解中,提供了如下属性信息。

  • value:String数组类型的属性,用于指定可以跨域请求的源列表,例如:value="http://binghe.com",则表示允许binghe.com域名下的资源实现跨域请求,如果指定为*,则是允许任意请求源跨域请求。
  • origins:String数组类型的属性,作用与value属性相同。
  • originPatterns:从Spring5.3版本开始提供的String数组类型的属性,可以用于设置多个跨域匹配规则。
  • allowedHeaders:String数组类型的属性,用于指定请求时允许跨域请求的请求头列表。例如:allowedHeaders="Content-Type"。默认表示所有请求头都可以跨域请求。
  • exposedHeaders:String数组类型的属性,表示响应头中允许访问的消息头,例如,exposedHeaders="Content-Length"
  • methods:RequestMethod数组类型的属性,表示允许跨域请求的HTTP方法。默认情况下,允许请求的HTTP方法与@RequestMapping注解相同。
  • allowCredentials:String类型的属性,表示是否允许跨域发送Cookie信息,使用此属性时,必须在value属性或者origins属性中明确指定具体的访问域。
  • maxAge:long类型的属性,表示预处理响应的最大缓存时间,单位为秒。默认值为1800秒,也就是30分钟。

# 2.2 使用场景

在基于SpringMVC或者SpringBoot开发Web应用时,如果采用前后端分离模式进行开发,前端与后端程序不在同一个域下,例如后端程序部署在binghe001.com下,前端程序部署在binghe002.com下,前端程序需要访问后端的服务。或者前端程序需要跨域访问外界的资源,例如,前端部署在binghe001.com下,需要跨域访问binghe002.com下的图片资源,此时就可以使用@CrossOrigin注解来处理跨域访问的问题。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码