1何爲跨域
簡單的說即爲瀏覽器限制訪問A站點下的js代碼對B站點下的url進行ajax請求。假如當前域名是www.abc.com,那麼在當前環境中運行的js代碼,出於安全考慮,正常情況下不能訪問www.zzz.com域名下的資源。
- 例如:以下代碼再本域名下可以通過js代碼正常調用接口
(function() {
var url = "http://localhost:8080/api/Home/update.json";
var data = {
"userId": 123,
"userName": "wangdachui"
};
$.ajax({
url: url,
type: 'POST',
dataType: 'json',
data: $.toJSON(data),
contentType: 'application/json'
}).done(function(result) {
console.log("success");
console.log(result);
}).fail(function() {
console.log("error");
})
})()
輸出爲:
Object {userId: 123, userName: "adminUpdate-wangdachui"}
- 但是在其他域名下訪問則出錯:
OPTIONS http://localhost:8080/api/Home/update.json
XMLHttpRequest cannot load http://localhost:8080/api/Home/update.json. Response to preflight request
2跨域處理流程(原理)看下圖
3解決跨域方案
cors 基本流程:首先發出預檢驗(Preflight)請求,它先向資源服務器發出一個OPTIONS方法、包含“Origin”頭的請求。該回復可以控制COR請求的方法,HTTP頭以及驗證等信息。只有該請求獲得允許以後,纔會發起真實的外域請求。
public class CORSFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { HttpServletResponse response = (HttpServletResponse) resp; response.setHeader("Access-Control-Allow-Origin","*"); response.setHeader("Access-Control-Allow-Methods","POST,GET,OPTIONS,DELETE"); response.setHeader("Access-Control-Max-Age","3600"); response.setHeader("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept"); response.setHeader("","");response.setHeader("",""); chain.doFilter(req, resp); } public void init(FilterConfig config) throws ServletException { } }
Access-Control-Allow-Origin: http://foo.org
Access-Control-Max-Age: 3628800
Access-Control-Allow-Methods: GET,PUT, DELETE
Access-Control-Allow-Headers: content-type
"Access-Control-Allow-Origin"表明它允許"http://foo.org"發起跨域請求
"Access-Control-Max-Age"表明在3628800秒內,不需要再發送預檢驗請求,可以緩存該結果
"Access-Control-Allow-Methods"表明它允許GET、PUT、DELETE的外域請求
"Access-Control-Allow-Headers"表明它允許跨域請求包含content-type頭
到此你已經完全解決了跨域問題但是我想在你做js 請求spring mvc 的ctr 比如jquery、angularjs、等等封裝的ajax post 請求是總是會有一些問題,這個我據我所知是你沒有把那個json字符串和json對象分清楚,或則你就是完全沒有用json格式發完了就出現了415 錯誤。關於這個有時間再分享。