欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

No ‘Access-Control-Allow-Origin‘ header is present跨域及解決

 更新時間:2023年02月17日 10:18:10   作者:brucelwl  
這篇文章主要介紹了No ‘Access-Control-Allow-Origin‘ header is present跨域及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

No ‘Access-Control-Allow-Origin‘ header is present

  • 1 瀏覽器的限制
  • 2 跨域
  • 3 瀏覽器發(fā)送的是 XHR (XMLHttpRequest)請求

當(dāng)以上三個條件都滿足時瀏覽器會拋出跨域請求異常(記住是瀏覽器拋出的異常,和服務(wù)端沒太大關(guān)系),在講跨域請求解決方案前先了解幾個問題。

http請求中,哪些是常見的簡單請求,哪些是非簡單請求

常見的簡單請求:請求方法為:GET ,HEAD,POST,請求header里面無自定義頭,Content-Type為以下幾種:text/plain  multipart/form-data application/x-www-form-urlencoded

常見的非簡單請求 :請求方法為:put delete的ajax請求,發(fā)送json格式的ajax請求,帶自定義頭的ajax請求

瀏覽器在發(fā)送跨域請求時候,會有哪些過程

如果是簡單請求,瀏覽器會先發(fā)送請求,然后判斷服務(wù)器返的返回頭中是否支持跨域請求,否則拋出跨域異常

如果是非簡單請求,瀏覽器會先發(fā)出OPTIONS請求方法的檢測命令,判斷服務(wù)器是否支持跨域請求,如果支持則發(fā)送真正的請求,如果不支持則拋出跨域異常,因此一個非簡單請求每次會發(fā)送兩個請求,后面跨域解決方案會講到緩存OPTIONS預(yù)檢請求

跨域解決方案

方案1:禁用瀏覽器跨域校驗,即允許跨域訪問,(這種方案不可取,不可能讓所有的瀏覽器設(shè)置允許跨域訪問)

谷歌瀏覽器禁用跨域校驗: 創(chuàng)建一個快捷方式發(fā)送到桌面 ,快捷方式--》右鍵---》屬性頁面中的目標(biāo)輸入框里追加  --disable-web-security --user-data-dir=C:\Program Files (x86)\Google\Chrome\Application (注意:--user-data-dir的值就是瀏覽器安裝目錄。)不一定生效

方案2:采用jsonp方式,需要后臺和前臺同時改動代碼,

1 前臺需要設(shè)置callback參數(shù),如果使用的是jquery ajax 那么dateType屬性設(shè)置為jsonp,jquery框架會自動設(shè)置參數(shù)名為callback的請求參數(shù),也可以通過jsonp屬性修改jsonp請求參數(shù)名,其他js框架根據(jù)具體api使用,

2 后臺接收到callback參數(shù)后認(rèn)為是jsonp請求,需要返回jsonp格式,普通json請求返回的content-Type是application/json,而jsonp返回的是application/javascript,同時也證明了jsonp請求服務(wù)端返回的是js腳本

3 jsonp請求參數(shù)名前后約定需要相同,例如jquery默認(rèn)使用的是callback

弊端:jsonp 需要前后端都去修改代碼,且jsonp是通過動態(tài)創(chuàng)建script腳本發(fā)送請求,僅支持 GET方法,jsonp發(fā)出的請求不是xhr請求,也是能解決跨域的原因

方案3:服務(wù)端解決跨域問題

通過編寫filter在response對象中添加響應(yīng)頭,告訴瀏覽器允許跨域訪問,* 號代碼允許所有的請求域名,所有的請求方法跨域訪問

@WebFilter("/*")
public class CORSFilter implements Filter {
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
 
        // 告訴瀏覽器允許所有的域訪問
        // 注意 * 不能滿足帶有cookie的訪問,Origin 必須是全匹配
        // resp.addHeader("Access-Control-Allow-Origin", "*");
        // 解決辦法通過獲取Origin請求頭來動態(tài)設(shè)置
        String origin = request.getHeader("Origin");
        if (StringUtils.hasText(origin)) {
            resp.addHeader("Access-Control-Allow-Origin", origin);
        }
        // 允許帶有cookie訪問
        resp.addHeader("Access-Control-Allow-Credentials", "true");
 
        // 告訴瀏覽器允許跨域訪問的方法
        resp.addHeader("Access-Control-Allow-Methods", "*");
 
        // 告訴瀏覽器允許帶有Content-Type,header1,header2頭的請求訪問
        // resp.addHeader("Access-Control-Allow-Headers", "Content-Type,header1,header2");
        // 設(shè)置支持所有的自定義請求頭
        String headers = request.getHeader("Access-Control-Request-Headers");
        if (StringUtils.hasText(headers)) {
            resp.addHeader("Access-Control-Allow-Headers", headers);
        }
 
        // 告訴瀏覽器緩存OPTIONS預(yù)檢請求1小時,避免非簡單請求每次發(fā)送預(yù)檢請求,提升性能
        resp.addHeader("Access-Control-Max-Age", "3600");
 
        chain.doFilter(request, resp);
    }
}

方案4:Spring框架提供了跨域解決方案

spring提供了 @CrossOrigin注解用戶解決跨域問題,同時支持全局配置

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
	@Override
	public void addCorsMappings(CorsRegistry registry) {
		registry.addMapping("/api/**")
			.allowedOrigins("http://domain2.com")
			.allowedMethods("PUT", "DELETE")
			.allowedHeaders("header1", "header2", "header3")
			.exposedHeaders("header1", "header2")
			.allowCredentials(false).maxAge(3600);
	}
}

方案5 服務(wù)端通過ngnix解決跨域問題 

location /{
?? ??? ??? ?proxy_pass http://localhost:8080/;
?? ??? ? ??
?? ??? ??? ?#告訴瀏覽器允許跨域訪問的方法
?? ??? ??? ?add_header Access-Control-Allow-Methods *;
?? ??? ??? ?# 告訴瀏覽器緩存OPTIONS預(yù)檢請求1小時
?? ??? ??? ?add_header Access-Control-Max-Age 3600;
?? ??? ??? ?#允許帶有cookie訪問
?? ??? ??? ?add_header Access-Control-Allow-Credentials true;
?? ??? ??? ?#注意 * 不能滿足帶有cookie的訪問,Origin 必須是全匹配,這里通過變量獲取
?? ??? ??? ?add_header Access-Control-Allow-Origin $http_origin;
?? ??? ??? ?#設(shè)置支持所有的自定義請求頭
?? ??? ??? ?add_header Access-Control-Allow-Headers $http_access_control_request_headers;
?? ??? ??? ?#如果預(yù)檢請求,則返回成功,不需要轉(zhuǎn)發(fā)到后端
?? ??? ??? ?if ($request_method = OPTIONS){
?? ??? ??? ??? ?return 200;
?? ??? ??? ?}
?? ??? ?}

方案6 客戶端通過nginx隱藏跨域

#轉(zhuǎn)發(fā)全部以/api開頭的請求到web服務(wù)器
???location??/api
???{
? ? ? ? proxy_pass?http://127.0.0.1:8080/api;
???}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中的排序與內(nèi)部比較器Compareable解析

    Java中的排序與內(nèi)部比較器Compareable解析

    這篇文章主要介紹了Java中的排序與內(nèi)部比較器Compareable解析,一般沒有特殊要求時,直接調(diào)用(底層默認(rèn)的升序排列)就可以得到想要的結(jié)果,所謂的 sort 方法排序底層都是基于這兩種排序,故如果需要設(shè)計成所想要的排序就需要了解底層排序原理,需要的朋友可以參考下
    2023-11-11
  • Java輸入數(shù)據(jù)的知識點整理

    Java輸入數(shù)據(jù)的知識點整理

    在本篇文章里小編給大家整理的是關(guān)于Java如何輸入數(shù)據(jù)的相關(guān)知識點內(nèi)容,有興趣的朋友們學(xué)習(xí)參考下。
    2020-01-01
  • 談?wù)勎覍pring Bean 生命周期的理解

    談?wù)勎覍pring Bean 生命周期的理解

    Spring Bean 的生命周期在整個 Spring 中占有很重要的位置,掌握這些可以加深對 Spring 的理解。這篇文章主要介紹了Spring Bean 生命周期,需要的朋友可以參考下
    2018-03-03
  • Java結(jié)構(gòu)型模式之橋接模式詳解

    Java結(jié)構(gòu)型模式之橋接模式詳解

    橋接模式是一種很實用的結(jié)構(gòu)型模式,如果系統(tǒng)中某個類存在兩個獨(dú)立變化的維度,通過橋接模式將這兩個維度分離出來,使兩者可以獨(dú)立擴(kuò)展
    2023-02-02
  • Java 實現(xiàn)完整功能的學(xué)生管理系統(tǒng)實例

    Java 實現(xiàn)完整功能的學(xué)生管理系統(tǒng)實例

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實現(xiàn)一個完整版學(xué)生管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • Java 重載、重寫、構(gòu)造函數(shù)的實例詳解

    Java 重載、重寫、構(gòu)造函數(shù)的實例詳解

    這篇文章主要介紹了Java 重載、重寫、構(gòu)造函數(shù)的實例詳解的相關(guān)資料,希望通過本文大家能理解掌握java 面向?qū)ο蟮姆椒?,需要的朋友可以參考?/div> 2017-09-09
  • 一個處理用戶登陸的servlet簡單實例

    一個處理用戶登陸的servlet簡單實例

    這篇文章主要介紹了一個處理用戶登陸的servlet簡單實例,可通過servlet實現(xiàn)處理用戶登錄的功能,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • java必學(xué)必會之this關(guān)鍵字

    java必學(xué)必會之this關(guān)鍵字

    java必學(xué)必會之this關(guān)鍵字,java中this的用法進(jìn)行了詳細(xì)的分析介紹,感興趣的小伙伴們可以參考一下
    2015-12-12
  • maven?springboot如何將jar包打包到指定目錄

    maven?springboot如何將jar包打包到指定目錄

    這篇文章主要介紹了maven?springboot如何將jar包打包到指定目錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java基于MySQL實現(xiàn)學(xué)生管理系統(tǒng)

    Java基于MySQL實現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java基于MySQL實現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論