http请求解决跨域问题

2016年05月18日

什么是请求跨域

同源策略说明: 传送门

JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。 即同源策略, 发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域 例子如下(图片出处):

解决方法

1. 服务端代理

即相同域下,由服务器端代为请求另一个域,获取数据并返回

2. JSONP (Json with Padding)

JSONP (小解释) Web页面上调用js文件时是不受是否跨域影响的,所以在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理,JSON的纯字符数据格式可以简洁的描述复杂数据,所以服务器JSON数据放入返回值中,客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

springMvc中的使用: 传送门

3. CORS (Cross-Origin Resource Sharing)

跨源资源共享 说明 传送门

通过服务器增加一个特殊的Header[Access-Control-Allow-Origin]来告知客户端跨域的限制,如果浏览器支持CORS的话,如果判断Origin通过的话,就会允许XHR进行请求,而不需要再使用jsonP或者代理文件。

spring中对CORS的支持 : 传送门

手动设置请求头从而支持CORS, 增加一个Filter,增加CORS的请求头, 再将filter配置进web.xml即可

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    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", "x-requested-with");
    chain.doFilter(req, res);
  }