Java中的跨域和@CrossOrigin注解的作用詳解
什么是跨域
在Controller中看到@CrossOrigin ,這是什么?有什么用?為什么要用?
@CrossOrigin是用來(lái)處理跨域請(qǐng)求的注解
先來(lái)說(shuō)一下什么是跨域:
(站在巨人的肩膀上)
跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript施加的安全限制。
所謂同源是指,域名,協(xié)議,端口均相同,不明白沒(méi)關(guān)系,舉個(gè)栗子:
- //www.123.com/index.html 調(diào)用 //www.123.com/server.PHP (非跨域)
- //www.123.com/index.html 調(diào)用 //www.456.com/server.php (主域名不同:123/456,跨域)
- //abc.123.com/index.html 調(diào)用 //def.123.com/server.php(子域名不同:abc/def,跨域)
- //www.123.com:8080/index.html調(diào)用 //www.123.com:8081/server.php(端口不同:8080/8081,跨域)
- //www.123.com/index.html 調(diào)用 https://www.123.com/server.php(協(xié)議不同:http/https,跨域)
請(qǐng)注意:localhost和127.0.0.1雖然都指向本機(jī),但也屬于跨域。
瀏覽器執(zhí)行javascript腳本時(shí),會(huì)檢查這個(gè)腳本屬于哪個(gè)頁(yè)面,如果不是同源頁(yè)面,就不會(huì)被執(zhí)行。
當(dāng)域名www.abc.com下的js代碼去訪問(wèn)www.def.com域名下的資源,就會(huì)受到限制。
@CrossOrigin可以處理跨域請(qǐng)求,讓你能訪問(wèn)不是一個(gè)域的文件。
跨域(CORS)支持
Spring Framework 4.2 GA為CORS提供了第一類(lèi)支持
使您比通常的基于過(guò)濾器的解決方案更容易和更強(qiáng)大地配置它
所以springMVC的版本要在4.2或以上版本才支持@CrossOrigin
使用方法簡(jiǎn)介說(shuō)明
controller中配置CORS
我們可在@RequestMapping注解的上面添加一個(gè)@CrossOrigin注解
則可啟用CORS(默認(rèn)情況下,@CrossOrigin允許在@RequestMapping注解中指定的所有源和HTTP方法)
例:
@RestController public class TestController { @CrossOrigin @PostMapping("/test/addRecord") public CommonResult<Integer> add(@RequestBody TestController oneRecord) { // ... } @GetMapping("/test/checkRecord") public CommonResult<TestController> checkRecord(@RequestParam Integer recordId) { // ... } }
@CrossOrigin注解是干什么用的
@CrossOrigin是一個(gè)Java注解,用于指示瀏覽器允許跨域請(qǐng)求資源。在Web應(yīng)用程序中,如果JavaScript代碼試圖從一個(gè)域名獲取來(lái)自不同域名的資源,這將會(huì)觸發(fā)瀏覽器的同源策略,從而導(dǎo)致瀏覽器阻止跨域請(qǐng)求。使用@CrossOrigin注解可以允許瀏覽器繞過(guò)同源策略,從而允許跨域請(qǐng)求。
@CrossOrigin注解可以用于類(lèi)級(jí)別或方法級(jí)別,如果用于類(lèi)級(jí)別,將適用于整個(gè)類(lèi)中的所有方法。它接受一些參數(shù),包括:
- origins:指示允許跨域請(qǐng)求的來(lái)源。默認(rèn)情況下,它是"*",表示允許來(lái)自任何來(lái)源的跨域請(qǐng)求。
- methods:指示允許的HTTP方法。默認(rèn)情況下,它包括GET、HEAD和POST。
- maxAge:指示瀏覽器可以緩存預(yù)檢請(qǐng)求的時(shí)間(以秒為單位)。
- allowedHeaders:指示允許的請(qǐng)求頭。
- exposedHeaders:指示可以訪問(wèn)響應(yīng)頭的列表。
總之,使用@CrossOrigin注解可以解決跨域請(qǐng)求的問(wèn)題,使得Web應(yīng)用程序能夠更靈活地使用跨域資源。
優(yōu)缺點(diǎn)分析
使用@CrossOrigin注解可以解決跨域請(qǐng)求的問(wèn)題,從而使Web應(yīng)用程序能夠更靈活地使用跨域資源。下面是@CrossOrigin注解的一些優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
使得Web應(yīng)用程序能夠更靈活地使用跨域資源,提高了開(kāi)發(fā)效率。允許跨域請(qǐng)求,使得多個(gè)域之間的交互更加便利??梢钥刂圃试S的請(qǐng)求來(lái)源、請(qǐng)求方法、請(qǐng)求頭等,從而增強(qiáng)了安全性。
缺點(diǎn):
允許跨域請(qǐng)求可能會(huì)導(dǎo)致一些安全風(fēng)險(xiǎn),例如跨站腳本攻擊(XSS)和跨站請(qǐng)求偽造(CSRF)。使用@CrossOrigin注解可能會(huì)使代碼更難以維護(hù)和測(cè)試,因?yàn)樗赡軙?huì)增加代碼的復(fù)雜度。在處理跨域請(qǐng)求時(shí),可能會(huì)出現(xiàn)性能問(wèn)題,因?yàn)闉g覽器需要進(jìn)行額外的預(yù)檢請(qǐng)求。
總之,@CrossOrigin注解的使用需要在安全性和開(kāi)發(fā)效率之間做出權(quán)衡,開(kāi)發(fā)人員需要根據(jù)具體情況進(jìn)行選擇和配置。
其他推薦解決跨域方法的選擇
Java處理跨域問(wèn)題的方法有很多種,下面列舉幾種常用的方法:
- 使用@CrossOrigin注解:如前面所述,可以使用@CrossOrigin注解來(lái)允許跨域請(qǐng)求。
- 使用Filter過(guò)濾器:使用Filter過(guò)濾器可以攔截所有請(qǐng)求并添加響應(yīng)頭,從而允許跨域請(qǐng)求。在Filter過(guò)濾器中,可以設(shè)置允許的請(qǐng)求來(lái)源、請(qǐng)求方法、請(qǐng)求頭等。
- 使用代理服務(wù)器:使用代理服務(wù)器可以將跨域請(qǐng)求發(fā)送到代理服務(wù)器,代理服務(wù)器再將請(qǐng)求發(fā)送到目標(biāo)服務(wù)器,并將響應(yīng)返回給瀏覽器。在這個(gè)過(guò)程中,瀏覽器只與代理服務(wù)器通信,避免了跨域問(wèn)題。
- 使用JSONP技術(shù):JSONP是一種在客戶端使用的跨域技術(shù),它允許在不受同源策略限制的情況下獲取跨域資源。在Java中,可以通過(guò)返回一個(gè)JavaScript函數(shù)調(diào)用來(lái)實(shí)現(xiàn)JSONP。
- 使用WebSocket協(xié)議:WebSocket是一種新型的協(xié)議,可以在瀏覽器和服務(wù)器之間建立雙向通信的連接。使用WebSocket協(xié)議可以避免跨域問(wèn)題,并且可以實(shí)現(xiàn)實(shí)時(shí)通信等功能。
總之,Java處理跨域問(wèn)題的方法有很多種,開(kāi)發(fā)人員需要根據(jù)具體情況選擇合適的方法。在使用這些方法時(shí),需要注意安全性和性能等方面的問(wèn)題。
到此這篇關(guān)于Java中的跨域和@CrossOrigin注解的作用詳解的文章就介紹到這了,更多相關(guān)跨域和@CrossOrigin注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別(動(dòng)力節(jié)點(diǎn)java學(xué)院整理)
很多朋友不清楚面向?qū)ο蠛兔嫦蜻^(guò)程有什么區(qū)別,接下來(lái)小編給大家整理了關(guān)于面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別講解,感興趣的朋友可以參考下2017-04-04Java中從JSON轉(zhuǎn)Java實(shí)體的多種方法詳解
在現(xiàn)在的日常開(kāi)發(fā)中不管前端還是后端,JSON 格式的數(shù)據(jù)是用得比較多的,甚至可以說(shuō)無(wú)處不在,這篇文章主要給大家介紹了關(guān)于Java中從JSON轉(zhuǎn)Java實(shí)體的多種方法,需要的朋友可以參考下2023-12-12SpringMVC?RESTFul實(shí)戰(zhàn)案例訪問(wèn)首頁(yè)
這篇文章主要為大家介紹了SpringMVC?RESTFul實(shí)戰(zhàn)案例訪問(wèn)首頁(yè),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05將java中的 string 類(lèi)型轉(zhuǎn)成 數(shù)組案例
這篇文章主要介紹了將java中的 string 類(lèi)型轉(zhuǎn)成 數(shù)組案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Java?JWT實(shí)現(xiàn)跨域身份驗(yàn)證方法詳解
JWT(JSON?Web?Token)是目前流行的跨域認(rèn)證解決方案,是一個(gè)開(kāi)放標(biāo)準(zhǔn)(RFC?7519),它定義了一種緊湊的、自包含的方式,用于作為JSON對(duì)象在各方之間安全地傳輸信息。本文將介紹JWT如何實(shí)現(xiàn)跨域身份驗(yàn)證,感興趣的可以學(xué)習(xí)一下2022-01-01