Spring中的@CrossOrigin注解的使用詳細(xì)解讀
@CrossOrigin注解的使用
跨源資源共享(CORS),是由大多數(shù)瀏覽器實(shí)現(xiàn)的W3C規(guī)范,允許對跨域請求進(jìn)行靈活授權(quán),用來代替IFRAME或JSONP等非正規(guī)實(shí)現(xiàn)方式。
@CrossOrigin是用來處理跨源資源共享(CORS)的注解。
注解解析
① value:
指定允許請求源列表,例如:value="//example.com"。
*表示允許來自任意請求源的請求。
其值存儲在響應(yīng)標(biāo)頭Access-Control-Allow-Origin中。
默認(rèn)情況下,其值為*,允許來自任意請求源的請求。
注意:CORS處理時,從Forwarded、X-Forwarded-Host、X-Forwarded-Port、X-Forwarded-Proto取請求源值。
② origins:
value與origins含義相同,可以任選value和origins進(jìn)行設(shè)置。
value與origins若同時存在,兩者的值需一致,否則啟動時會出現(xiàn)異常。
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:
指定允許實(shí)際請求標(biāo)頭列表,例如:allowedHeaders="Content-Type,Access-Token"。
*表示允許實(shí)際請求帶有任意標(biāo)頭。
其值存儲在響應(yīng)標(biāo)頭Access-Control-Allow-Headers中。
若為Cache-Control、Content-Language、Expires、Last-Modified、Pragma,則無需設(shè)置。
默認(rèn)情況下,其值為*,允許實(shí)際請求帶有任意標(biāo)頭。
④ exposedHeaders:
指定允許客戶端(如瀏覽器)訪問的響應(yīng)標(biāo)頭列表,例如:exposedHeaders="Content-Length"。
其值存儲在實(shí)際CORS請求的響應(yīng)頭Access-Control-Expose-Headers中。
默認(rèn)情況下,只允許客戶端訪問:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。
?⑤ methods:
指定允許請求的HTTP方法。
默認(rèn)情況下,允許請求的HTTP方法與@RequestMapping相同。
⑥ allowCredentials:
指定其值,表示客戶端(如瀏覽器)是否應(yīng)將憑證(如Cookies)和跨域請求一起發(fā)送到服務(wù)器。
其值存儲在預(yù)處理響應(yīng)標(biāo)頭Access-Control-Allow-Credentials中。
注意:此選項(xiàng)與配置域建立了高級別的信任,由于公開敏感的信息(如Cookies或CSRF令牌),會增加Web應(yīng)用程序受攻擊的概率。
默認(rèn)情況下,此值不設(shè)置,因此不允許使用任何憑證。
⑦ maxAge:
指定預(yù)處理響應(yīng)的最大緩存期限,單位為秒。
其值存儲在預(yù)處理響應(yīng)標(biāo)頭Access-Control-Max-Age中。
其值設(shè)置合理可以有效減少客戶端與服務(wù)器預(yù)處理請求的交互次數(shù)。
其值為負(fù),表示未定義。
默認(rèn)情況下,其值為1800秒(30分鐘)。
⑧ DEFAULT_ORIGINS、DEFAULT_ALLOWED_HEADERS、DEFAULT_ALLOW_CREDENTIALS、DEFAULT_MAX_AGE:
這些屬性用于設(shè)置默認(rèn)值,在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."; } /** * 使用默認(rèn)值的@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) 啟動服務(wù),使用端口9199。
3) 使用工具頁面,啟動服務(wù),使用端口9299。
① 訪問//localhost:9199/spring-annotations/WebAnnotations/UnCrossOrigin.do。
② 訪問//localhost:9199/spring-annotations/WebAnnotations/CrossOrigin.do。
③ 訪問//localhost:9199/spring-annotations/WebAnnotations/CrossOriginOrigins.do。
總結(jié)
Spring簡化了@CrossOrigin開過過程中的配置,使得跨域請求處理更加便捷。
源碼解析基于spring-framework-5.0.5.RELEASE版本源碼。
若文中存在錯誤和不足,歡迎指正!
到此這篇關(guān)于Spring中的@CrossOrigin注解的使用詳細(xì)解讀的文章就介紹到這了,更多相關(guān)@CrossOrigin注解的使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java設(shè)計(jì)模式學(xué)習(xí)之代理模式
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式學(xué)習(xí)之代理模式的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10spring?boot如何通過自定義注解和AOP攔截指定的請求
這篇文章主要介紹了spring?boot通過自定義注解和AOP攔截指定的請求,本文主要通過切面類和自定注解的方式,攔截指定的接口(代碼中已經(jīng)作了詳細(xì)的說明),需要的朋友可以參考下2024-06-06IDEA插件之mybatisx插件使用教程(超詳細(xì)!)
MybatisX 是一款基于IDEA的快速開發(fā)插件,為效率而生,下面這篇文章主要給大家介紹了關(guān)于IDEA插件之mybatisx插件使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06