這篇文章主要介紹“Springboot怎么解決跨域請求問題”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Springboot怎么解決跨域請求問題”文章能幫助大家解決問題。
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),公安企業(yè)網(wǎng)站建設(shè),公安品牌網(wǎng)站建設(shè),網(wǎng)站定制,公安網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,公安網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
1、什么是跨域
由于瀏覽器同源策略(同源策略,它是由Netscape提出的一個(gè)著名的安全策略?,F(xiàn)在所有支持JavaScript 的瀏覽器都會(huì)使用這個(gè)策略。所謂同源是指,域名,協(xié)議,端口相同。),凡是發(fā)送請求url的協(xié)議、域名、端口三者之間任意一與當(dāng)前頁面地址不同即為跨域。
具體可以查看下表:
2、springboot如何解決跨域問題
1.普通跨域請求解決方案:
①請求接口添加注解@CrossOrigin(origins = "http://127.0.0.1:8020", maxAge = 3600)
說明:origins = "http://127.0.0.1:8020" origins值為當(dāng)前請求該接口的域
②通用配置(所有接口都允許跨域請求)
新增一個(gè)configration類 或 在Application中加入CorsFilter和CorsConfiguration方法
@Configuration public class CorsConfig { private CorsConfiguration buildConfig() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); // 1允許任何域名使用 corsConfiguration.addAllowedHeader("*"); // 2允許任何頭 corsConfiguration.addAllowedMethod("*"); // 3允許任何方法(post、get等) return corsConfiguration; } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", buildConfig()); // 4 return new CorsFilter(source); } }
2.ajax自定義headers的跨域請求
$.ajax({ type:"GET", url:"http://localhost:8766/main/currency/sginInState", dataType:"JSON", data:{ uid:userId }, beforeSend: function (XMLHttpRequest) { XMLHttpRequest.setRequestHeader("Authorization", access_token); }, success:function(res){ console.log(res.code) } })
此時(shí)請求http://localhost:8766/main/currency/sginInState接口發(fā)現(xiàn)OPTIONS http://localhost:8766/main/currency/sginInState 500錯(cuò)誤,普通跨域的解決方案已經(jīng)無法解決這種問題,為什么會(huì)出現(xiàn)OPTIONS請求呢?
原因
瀏覽器會(huì)在發(fā)送真正請求之前,先發(fā)送一個(gè)方法為OPTIONS的預(yù)檢請求 Preflighted requests 這個(gè)請求是用來驗(yàn)證本次請求是否安全的,但是并不是所有請求都會(huì)發(fā)送,需要符合以下條件:
?請求方法不是GET/HEAD/POST
?POST請求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain
?請求設(shè)置了自定義的header字段
對于管理端的接口,我有對接口進(jìn)行權(quán)限校驗(yàn),每次請求需要在header中攜帶自定義的字段(token),所以瀏覽器會(huì)多發(fā)送一個(gè)OPTIONS請求去驗(yàn)證此次請求的安全性。
為何OPTIONS請求是500呢?
OPTIONS請求只會(huì)攜帶自定義的字段,并不會(huì)將相應(yīng)的值帶入進(jìn)去,而后臺校驗(yàn)token字段時(shí) token為NULL,所以驗(yàn)證不通過,拋出了一個(gè)異常。
那么我們現(xiàn)在來解決這種問題:
① spring boot項(xiàng)目application.yml中添加
spring:
mvc:
dispatch-options-request: true
注意:這種解決方案可能在某些情況下并不能解決OPTIONS問題,原因可能是環(huán)境問題,也可能是復(fù)雜的自定義filter過濾器配置問題等。
②添加過濾器配置
第一步:手寫RequestFilter請求過濾器配置類此類需要實(shí)現(xiàn)HandlerInterceptor類,HandlerInterceptor類是org.springframework.web.servlet.HandlerInterceptor下的。
具體代碼實(shí)現(xiàn):
@Component public class RequestFilter implements HandlerInterceptor { public boolean preHandler(HttpServletRequest request,HttpServletResponse response,Object handler){ response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS"); response.setHeader("Access-Control-Max-Age", "86400"); response.setHeader("Access-Control-Allow-Headers", "Authorization"); // 如果是OPTIONS請求則結(jié)束 if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) { response.setStatus(HttpStatus.NO_CONTENT.value()); return false; } return true; } }
第二步:手寫MyWebConfiguration此類需要繼承WebMvcConfigurationSupport。
注意:WebMvcConfigurationSupport是2.x版本以上的,1.x版本為WebMvcConfigurerAdapter 。
具體代碼實(shí)現(xiàn):
@Component public class MyWebConfiguration extends WebMvcConfigurationSupport{ @Resource private RequestFilter requestFilter; @Override public void addInterceptors(InterceptorRegistry registry) { // 跨域攔截器 registry.addInterceptor(requestFilter).addPathPatterns("/**"); } }
關(guān)于“Springboot怎么解決跨域請求問題”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識點(diǎn)。
網(wǎng)頁名稱:Springboot怎么解決跨域請求問題
文章鏈接:http://chinadenli.net/article36/ppgdpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、定制網(wǎng)站、ChatGPT、網(wǎng)站維護(hù)、虛擬主機(jī)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)