Spring Boot 解決跨域問題的 3 種方案
點擊上方?java項目開發(fā),選擇?設(shè)為星標(biāo)
優(yōu)質(zhì)文章,及時送達
--
問題背景:
Same Origin Policy,譯為“同源策略”。它是對于客戶端腳本(尤其是JavaScript)的重要安全度量標(biāo)準(zhǔn),其目的在于防止某個文檔或者腳本從多個不同“origin”(源)裝載。
它認(rèn)為自任何站點裝載的信賴內(nèi)容是不安全的。當(dāng)被瀏覽器半信半疑的腳本運行在沙箱時,它們應(yīng)該只被允許訪問來自同一站點的資源,而不是那些來自其它站點可能懷有惡意的資源。
CORS簡介:
詳解響應(yīng)頭:
Access-Control-Allow-Origin 該字段必填。它的值要么是請求時Origin字段的具體值,要么是一個*,表示接受任意域名的請求。 Access-Control-Allow-Methods 該字段必填。它的值是逗號分隔的一個具體的字符串或者*,表明服務(wù)器支持的所有跨域請求的方法。注意,返回的是所有支持的方法,而不單是瀏覽器請求的那個方法。這是為了避免多次"預(yù)檢"請求。 Access-Control-Expose-Headers 該字段可選。CORS請求時,XMLHttpRequest對象的getResponseHeader()方法只能拿到6個基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必須在Access-Control-Expose-Headers里面指定。 Access-Control-Allow-Credentials 該字段可選。它的值是一個布爾值,表示是否允許發(fā)送Cookie.默認(rèn)情況下,不發(fā)生Cookie,即:false。對服務(wù)器有特殊要求的請求,比如請求方法是PUT或DELETE,或者Content-Type字段的類型是application/json,這個值只能設(shè)為true。如果服務(wù)器不要瀏覽器發(fā)送Cookie,刪除該字段即可。 Access-Control-Max-Age 該字段可選,用來指定本次預(yù)檢請求的有效期,單位為秒。在有效期間,不用發(fā)出另一條預(yù)檢請求。
解決辦法:
第一種辦法:
import?org.springframework.context.annotation.Configuration;
import?org.springframework.web.servlet.config.annotation.CorsRegistry;
import?org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public?class?CorsConfig?implements?WebMvcConfigurer?{
????@Override
????public?void?addCorsMappings(CorsRegistry?registry)?{
????????registry.addMapping("/**")
????????????????.allowedOrigins("*")
????????????????.allowedMethods("GET",?"HEAD",?"POST",?"PUT",?"DELETE",?"OPTIONS")
????????????????.allowCredentials(true)
????????????????.maxAge(3600)
????????????????.allowedHeaders("*");
????}
}
/**
?*?An?implementation?of?{@link?WebMvcConfigurer}?with?empty?methods?allowing
?*?subclasses?to?override?only?the?methods?they're?interested?in.
?*
?*?@author?Rossen?Stoyanchev
?*?@since?3.1
?*?@deprecated?as?of?5.0?{@link?WebMvcConfigurer}?has?default?methods?(made
?*?possible?by?a?Java?8?baseline)?and?can?be?implemented?directly?without?the
?*?need?for?this?adapter
?*/
@Deprecated
public?abstract?class?WebMvcConfigurerAdapter?implements?WebMvcConfigurer?{}
第二種辦法:
import?org.springframework.context.annotation.Configuration;
import?javax.servlet.*;
import?javax.servlet.annotation.WebFilter;
import?javax.servlet.http.HttpServletResponse;
import?java.io.IOException;
@WebFilter(filterName?=?"CorsFilter?")
@Configuration
public?class?CorsFilter?implements?Filter?{
????@Override
????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-Credentials",?"true");
????????response.setHeader("Access-Control-Allow-Methods",?"POST,?GET,?PATCH,?DELETE,?PUT");
????????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?class?GoodsController?{
????@CrossOrigin(origins?=?"http://localhost:4000")
????@GetMapping("goods-url")
????public?Response?queryGoodsWithGoodsUrl(@RequestParam?String?goodsUrl)?throws?Exception?{}
}??
@Target({?ElementType.METHOD,?ElementType.TYPE?})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public?@interface?CrossOrigin?{}
作者:telami
telami.cn/2019/springboot-resolve-cors/
-?END - 推薦案例
溫暖提示
為了方便大家更好的學(xué)習(xí),本公眾號經(jīng)常分享一些完整的單個功能案例代碼給大家去練習(xí),如果本公眾號沒有你要學(xué)習(xí)的功能案例,你可以聯(lián)系小編(微信:xxf960513)提供你的小需求給我,我安排我們這邊的開發(fā)團隊免費幫你完成你的案例。 注意:只能提單個功能的需求不能要求功能太多,比如要求用什么技術(shù),有幾個頁面,頁面要求怎么樣?
請長按識別二維碼
想學(xué)習(xí)更多的java功能案例請關(guān)注
Java項目開發(fā)
如果你覺得這個案例以及我們的分享思路不錯,對你有幫助,請分享給身邊更多需要學(xué)習(xí)的朋友。別忘了《留言+點在看》給作者一個鼓勵哦
評論
圖片
表情


