Spring中的@CrossOrigin注解的使用详细解读
@CrossOrigin注解的使用
跨源资源共享(CORS),是由大多数浏览器实现的W3C规范,允许对跨域请求进行灵活授权,用来代替IFRAME或JSONP等非正规实现方式。
@CrossOrigin是用来处理跨源资源共享(CORS)的注解。
注解解析
① value:
指定允许请求源列表,例如:value="//example.com"。
*表示允许来自任意请求源的请求。
其值存储在响应标头Access-Control-Allow-Origin中。
默认情况下,其值为*,允许来自任意请求源的请求。
注意:CORS处理时,从Forwarded、X-Forwarded-Host、X-Forwarded-Port、X-Forwarded-Proto取请求源值。
② origins:
value与origins含义相同,可以任选value和origins进行设置。
value与origins若同时存在,两者的值需一致,否则启动时会出现异常。
Caused by: org.springframework.core.annotation.AnnotationConfigurationException: In annotation [org.springframework.web.bind.annotation.CrossOrigin] declared on public java.lang.String com.arhorchin.securitit.webannotations.CrossOriginController.crossOriginOrigins(java.util.Map) throws java.lang.Exception and synthesized from [@org.springframework.web.bind.annotation.CrossOrigin(maxAge=-1, methods=[], exposedHeaders=[], origins=[http://localhost:9299], allowedHeaders=[], value=[http://localhost:92991], allowCredentials=)], attribute 'origins' and its alias 'value' are present with values of [{http://localhost:9299}] and [{http://localhost:92991}], but only one is permitted.
③ allowedHeaders:
指定允许实际请求标头列表,例如:allowedHeaders="Content-Type,Access-Token"。
*表示允许实际请求带有任意标头。
其值存储在响应标头Access-Control-Allow-Headers中。
若为Cache-Control、Content-Language、Expires、Last-Modified、Pragma,则无需设置。
默认情况下,其值为*,允许实际请求带有任意标头。
④ exposedHeaders:
指定允许客户端(如浏览器)访问的响应标头列表,例如:exposedHeaders="Content-Length"。
其值存储在实际CORS请求的响应头Access-Control-Expose-Headers中。
默认情况下,只允许客户端访问:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。
⑤ methods:
指定允许请求的HTTP方法。
默认情况下,允许请求的HTTP方法与@RequestMapping相同。
⑥ allowCredentials:
指定其值,表示客户端(如浏览器)是否应将凭证(如Cookies)和跨域请求一起发送到服务器。
其值存储在预处理响应标头Access-Control-Allow-Credentials中。
注意:此选项与配置域建立了高级别的信任,由于公开敏感的信息(如Cookies或CSRF令牌),会增加Web应用程序受攻击的概率。
默认情况下,此值不设置,因此不允许使用任何凭证。
⑦ maxAge:
指定预处理响应的最大缓存期限,单位为秒。
其值存储在预处理响应标头Access-Control-Max-Age中。
其值设置合理可以有效减少客户端与服务器预处理请求的交互次数。
其值为负,表示未定义。
默认情况下,其值为1800秒(30分钟)。
⑧ DEFAULT_ORIGINS、DEFAULT_ALLOWED_HEADERS、DEFAULT_ALLOW_CREDENTIALS、DEFAULT_MAX_AGE:
这些属性用于设置默认值,在Spring 5.0+版本中已废弃,由CorsConfiguration.applyPermitDefaultValues()方法来完成其功能。
注解示例
1) 建Controller,用来演示@CrossOrigin的使用方法。
package com.arhorchin.securitit.webannotations; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; /** * @author Securitit. * @note 演示@CrossOrigin注解使用方法. */ @Controller @RequestMapping("/WebAnnotations") public class CrossOriginController { /** * logger. */ private Logger logger = LoggerFactory.getLogger(CrossOriginController.class); /** * 未使用@CrossOrigin. */ @ResponseBody @RequestMapping( value = "/UnCrossOrigin.do", method = RequestMethod.GET) public String unCrossOrigin(@RequestHeader Map<String, String> requestHeaderMap) throws Exception { logger.info("@CrossOrigin use default value."); return "@CrossOrigin use default value."; } /** * 使用默认值的@CrossOrigin. */ @ResponseBody @RequestMapping( value = "/CrossOrigin.do", method = RequestMethod.GET) @CrossOrigin public String crossOrigin(@RequestHeader Map<String, String> requestHeaderMap) throws Exception { logger.info("@CrossOrigin use default value."); return "@CrossOrigin use default value."; } /** * 指定origins属性的@CrossOrigin. */ @ResponseBody @RequestMapping( value = "/CrossOriginOrigins.do", method = RequestMethod.GET) @CrossOrigin(origins="http://localhost:9299") public String crossOriginOrigins(@RequestHeader Map<String, String> requestHeaderMap) throws Exception { logger.info("@CrossOrigin with origins."); return "@CrossOrigin with origins."; } /** * 指定origins、allowedHeaders、exposedHeaders、allowCredentials属性的@CrossOrigin. */ @ResponseBody @RequestMapping( value = "/CrossOriginOriginsAllowCredentials.do", method = RequestMethod.GET) @CrossOrigin(origins="http://localhost:9299", allowCredentials="true") public String crossOriginAllowedHeadersExposedHeadersAllowCredentials(@RequestHeader Map<String, String> requestHeaderMap) throws Exception { logger.info("@CrossOrigin with origins、allowedHeaders、exposedHeaders、allowCredentials."); return "@CrossOrigin with origins、allowedHeaders、exposedHeaders、allowCredentials."; } }
2) 启动服务,使用端口9199。
3) 使用工具页面,启动服务,使用端口9299。
① 访问//localhost:9199/spring-annotations/WebAnnotations/UnCrossOrigin.do。
② 访问//localhost:9199/spring-annotations/WebAnnotations/CrossOrigin.do。
③ 访问//localhost:9199/spring-annotations/WebAnnotations/CrossOriginOrigins.do。
总结
Spring简化了@CrossOrigin开过过程中的配置,使得跨域请求处理更加便捷。
源码解析基于spring-framework-5.0.5.RELEASE版本源码。
若文中存在错误和不足,欢迎指正!
到此这篇关于Spring中的@CrossOrigin注解的使用详细解读的文章就介绍到这了,更多相关@CrossOrigin注解的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Boot RabbitMQ 延迟消息实现完整版示例
本篇文章主要介绍了Spring Boot RabbitMQ 延迟消息实现完整版示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-05-05Java中EnumMap和EnumSet枚举操作类的简单使用详解
这篇文章主要介绍了Java中EnumMap和EnumSet枚举操作类的简单使用详解,EnumMap是Map接口的一种实现,专门用于枚举类型的键,所有枚举的键必须来自同一个枚举 EnumMap不允许键为空,允许值为空,需要的朋友可以参考下2023-11-11解决问题:Failed to execute goal org.apache.m
这篇文章主要给大家介绍了关于解决问题:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources的相关资料,文中将解决的办法介绍的非常详细,需要的朋友可以参考下2023-03-03
最新评论