跨域Ajax請求時是否帶Cookie的設定__Ajax

來源:互聯網
上載者:User
1. 無關Cookie跨域Ajax請求 用戶端

以 Jquery 的 ajax 為例:

$.ajax({        url : 'http://remote.domain.com/corsrequest',        data : data,        dataType: 'json',        type : 'POST',        crossDomain: true,        contentType: "application/json", // POST時必須        ...

主要注意的是參數 crossDomain: true。發送Ajax時,Request header 中會包含跨域的額外資訊,但不會含cookie。 伺服器端

跨域的允許主要由伺服器端控制。伺服器端通過在響應的 header 中設定 Access-Control-Allow-Origin 及相關一系列參數,提供跨域訪問的允許策略。相關參數的設定介紹,可參見 [Access_control_CORS]

以Java為例:

/*** Spring Controller中的方法:*/    @RequestMapping(value = "/corsrequest")    @ResponseBody    public Map<String, Object> mainHeaderInfo(HttpServletResponse response) {        response.setHeader("Access-Control-Allow-Origin", "*");        ...}
通過在響應 header 中設定 ‘*’ 來允許來自所有域的跨域請求訪問。
response.setHeader("Access-Control-Allow-Origin", "*");
只允許來自特定域 http://my.domain.cn:8080 的跨域訪問
response.setHeader("Access-Control-Allow-Origin", "http://my.domain.cn:8080");
較靈活的設定方式,允許所有包含 mydomain.com 的網域名稱訪問.
if(request.getHeader("Origin").contains("mydomain.com")) {    response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));}
2. 帶Cookie的跨域Ajax請求 用戶端
$.ajax({        url : 'http://remote.domain.com/corsrequest',        data : data,        dataType: 'json',        type : 'POST',        xhrFields: {            withCredentials: true        },        crossDomain: true,        contentType: "application/json",        ...

通過設定 withCredentials: true ,發送Ajax時,Request header中便會帶上 Cookie 資訊。 伺服器端

相應的,對於用戶端的參數,伺服器端也需要進行設定:

/*** Spring Controller中的方法:*/    @RequestMapping(value = "/corsrequest")    @ResponseBody    public Map<String, Object> getUserBaseInfo(HttpServletResponse response) {        if(request.getHeader("Origin").contains("woego.cn")) {            response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));        }        response.setHeader("Access-Control-Allow-Credentials", "true");        ...}

對應用戶端的 xhrFields.withCredentials: true 參數,伺服器端通過在響應 header 中設定 Access-Control-Allow-Credentials = true 來運行用戶端攜帶認證式訪問。通過對 Credentials 參數的設定,就可以保持跨域 Ajax 時的 Cookie。這裡需要注意的是:

伺服器端 Access-Control-Allow-Credentials = true時,參數Access-Control-Allow-Origin 的值不能為 '*' 3. Java中使用跨域 Filter

當允許跨域訪問的介面較多時,在每個請求中都添加 Access-Control-Allow-Origin 顯然是不合適的。對於比較原生的 Java web 應用,使用 Filter 是一個不錯的選擇。

NOTE:不同的架構,特別是支援REST的架構,大多提供了自己的跨網域設定方式,如Spring4的Config等,可以優先從使用的架構中尋找支援。

Filter本身很簡單,可以直接把上面兩句設定 Header 的語句抽取出來寫一個Filter。這裡推薦一個 Tomcat 中的 Filter:org.apache.catalina.filters.CorsFilter。

引入
這個類在 Tomcat 的 catalina.jar 中,可以通過將 tomcat/lib 下的 jar 包引用到項目中的方式來使用。但如果你對項目的 jar 環境有’潔癖’, 也可以單獨把 這個類的 SVN源碼 拷貝到項目中,修改(刪除)一下‘日誌’和‘異常提示內容’的引用就可以運行在任何原生java web項目中了。

設定方法
在 web.xml 中設定Filter:

<filter>  <filter-name>CorsFilter</filter-name>  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class></filter><filter-mapping>  <filter-name>CorsFilter</filter-name>  <url-pattern>/*</url-pattern></filter-mapping>

一點補充:
Filter的 預設 設定包含了:

<filter>  <filter-name>CorsFilter</filter-name>  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>  <init-param>        <param-name>cors.allowed.origins</param-name>        <param-value>*</param-value>  </init-param>  <init-param>        <param-name>cors.support.credentials</param-name>        <param-value>true</param-value>  </init-param></filter><filter-mapping>  <filter-name>CorsFilter</filter-name>  <url-pattern>/*</url-pattern></filter-mapping>

這裡的 cors.allowed.origins 雖然是 ‘*’,但實現上已經被最佳化,不會與 credentials 衝突。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.