1. 程式人生 > >Access-Control-Allow-Origin 跨域設定多域名

Access-Control-Allow-Origin 跨域設定多域名

在HTML5中有一種新的跨域方式,即設定“Access-Control-Allow-Origin”可以指定允許跨域訪問的域名。
Node.js中可以這樣寫

app.all(‘*’, function(req, res, next) {
res.header(“Access-Control-Allow-Origin”, ‘https://www.google.com‘);
res.header(‘Access-Control-Allow-Methods’, ‘POST, GET’);
res.header(‘Access-Control-Allow-Headers’, ‘X-Requested-With’);
res.header(‘Access-Control-Allow-Headers’, ‘Content-Type’);
next();
});
但在實際使用中,可能需要設定多個域名。
在網上查詢資料,有一種寫法

於是換種方式,查資料發現,許多是先自己判斷域名是否是允許的,如果是再設定允許跨域訪問。那麼程式碼應該改成如下形式

app.all(‘*’, function(req, res, next) {
if( req.headers.origin == ‘https://www.google.com’ || req.headers.origin == ‘https://www.baidu.com’ ){
res.header(“Access-Control-Allow-Origin”, req.headers.origin);
res.header(‘Access-Control-Allow-Methods’, ‘POST, GET’);
res.header(‘Access-Control-Allow-Headers’, ‘X-Requested-With’);
res.header(‘Access-Control-Allow-Headers’, ‘Content-Type’);
}
next();
});
使用時可以把允許訪問的域名寫成一個數組,然後JS寫一個比較字串是否在陣列內的函式,這樣使用就比較方便了。

其中,Access-Control-Allow-Origin就是我們需要設定的域名,Access-Control-Allow-Methods是允許的請求方式,Access-Control-Allow-Headers跨域允許包含的頭。

——————–java—————————-
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) res;
String [] allowDomain= {“

http://132.12.11.11:8888“,”http://123.112.112.12:80“,”http://123.16.12.23“,”http://121.12.18.13:10195“};
Set allowedOrigins= new HashSet(Arrays.asList(allowDomain));
String originHeader=((HttpServletRequest) req).getHeader(“Origin”);
if (allowedOrigins.contains(originHeader)){
((HttpServletResponse) res).setHeader(“Access-Control-Allow-Origin”, originHeader);
((HttpServletResponse) res).setContentType(“application/json;charset=UTF-8”);
((HttpServletResponse) res).setHeader(“Access-Control-Allow-Methods”, “POST, GET, OPTIONS, DELETE”);
((HttpServletResponse) res).setHeader(“Access-Control-Max-Age”, “3600”);
((HttpServletResponse) res).setHeader(“Access-Control-Allow-Headers”, “Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token”);//表明伺服器支援的所有頭資訊欄位
((HttpServletResponse) res).setHeader(“Access-Control-Allow-Credentials”, “true”); //如果要把Cookie發到伺服器,需要指定Access-Control-Allow-Credentials欄位為true;
((HttpServletResponse) res).setHeader(“XDomainRequestAllowed”,”1”);
}
chain.doFilter(req, res);
return;
}