1. 程式人生 > >跨域問題:“No'Access-Control-Allow-Origin'headerispresentontherequestedresource”解決

跨域問題:“No'Access-Control-Allow-Origin'headerispresentontherequestedresource”解決

今天試了一下只用SpringMVC寫介面,然後用本地的 ajax 去訪問介面請求 json 資料,但瀏覽器報了一個“跨域”請求的錯誤,個人理解的跨域問題是,服務端和客戶端的請求不在同一個域名下,但是我這都是在本機上部署的呀,這是什麼問題呢?

原來我理解的“跨域”只是我個人的理解,在網上搜索解決方法,都是在SpringMVC 的伺服器中寫一個過濾器 Filter ,讓 Filter 攔截請求,在response返回的時候加上一些請求頭,這樣就可以解決跨域的問題,類似於下面這樣:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

package com.kay.filter;

import javax.servlet.*;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

/**

* Created

by kay on 2017/12/7.

*/

public class CrossFilter implements Filter{

public void init(FilterConfig filterConfig) throws ServletException {

}

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

HttpServletResponse response= (HttpServletResponse) servletResponse;

String origin= servletRequest.getRemoteHost()+":"+servletRequest.getRemotePort();

response.setHeader("Access-Control-Allow-Origin", "*");

response.setHeader("Access-Control-Allow-Headers", "Authentication");

/* response.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,DELETE");

response.setHeader("Access-Control-Max-Age","3600");

response.setHeader("Access-Control-Allow-Credentials","true");*/

filterChain.doFilter(servletRequest,servletResponse);

}

public void destroy() {

}

}

然後在web.xml中配置一下filter:

?

1

2

3

4

5

6

7

8

<filter>

<filter-name>cors</filter-name>

<filter-class>com.kay.filter.CrossFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>cors</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

而在前端請求中,ajax 引數中的 dataType 要改為 “text”,不支援 dataType:”json”:

?

1

2

3

4

5

6

7

8

9

10

11

$.ajax({

type:"GET",//請求方式

dataType:"text",//返回引數的型別 text/html

success:function (data) {//請求成功後呼叫的函式

alert("succ:"+data);

},

error:function (textStatus) {//請求失敗後呼叫的函式

alert("fail");

}

})

為什麼要加像 ”Access-Control-Allow-Origin“ 這樣的響應頭就能解決跨域問題呢?

跨域請求又叫,”跨域資源共享”(Cross-origin resource sharing),它允許瀏覽器向跨源伺服器,發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。

CORS需要瀏覽器和伺服器同時支援。

伺服器會檢查 瀏覽器的請求中是否 有 ”Origin“請求頭,它是在跨域請求發出的時候 由瀏覽器自動加上的,然後伺服器檢查這個 請求頭設定的 伺服器的源(來自於哪裡)來判斷是否響應,是否允許這個請求訪問,我們會看到設定response.setHeader("Access-Control-Allow-Origin", "*"); 它的意思就是允許所有的源訪問伺服器,也可以只將自己的源(域名)設定就不允許其他的源訪問。