由于这两天在做项目的时候遇到了跨域这个问题,为了加深记忆和理解所以在这里献丑谈谈自己的看法。如果有不同的声音希望大家能够拍砖指出。
1.什么是跨域
跨域是指浏览器不能执行非本域下的请求,也就是说你提交的post、get请求不是你自己的服务器域。这是浏览器的一种处于安全限制的同源策略所致,它指Ajax请求所在的页面和被请求的页面在协议、域名、端口均相同才能被访问。
例如:
http://a.baidu.com 和 http://b.baidu.com就是存在跨域访问的。
2.CORS解决跨域
跨域的解决方案挺多的,但是我都不会,所以还是主要跟谈谈在服务端对跨域的处理吧。
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。就是说CORS 通过在 HTTP 设置header信息来允许服务器指定哪些跨域请求是允许的。
实现filter,在拦截器中设置
public class SimpleCORSFilter implements Filter
{
@Override
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, PUT, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Cache-Control, token");
chain.doFilter(req, res);
}
@Override
public void destroy()
{
// TODO Auto-generated method stub
}
@Override
public void init(FilterConfig arg0) throws ServletException
{
// TODO Auto-generated method stub
}
}
参数解释:
Access-Control-Allow-Origin:
这个Header是用来告诉浏览器,我的这个URL的资源是允许任何来源的请求访问我,如果值是*则表示表示接受任意域名的请求。
Access-Control-Allow-Methods:
顾名思义,表明服务器支持的所有跨域请求的方法。
Access-Control-Max-Age:
用来指定本次预检请求的有效期,单位为秒。在上面的设置中,即允许缓存该条回应为3600秒,在此期间不用发出另一条预检请求。
Access-Control-Allow-Headers:
表明服务器支持的所有头信息字段,不限于浏览器在”预检”中请求的字段。原文:The Access-Control-Allow-Headers header is used in response to a preflight request to indicate which HTTP headers can be used when making the actual request.
3.总结
本位写的比较简单,主要以总结为主。
参考链接:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Access-Control-Allow-Headers