什么是跨域问题?
跨域问题是指从一个域名的网页向另外一个域名的网页请求资源。在javaWeb项目的开发中,如果采用前后端分离的架构进行开发就会出现跨域问题,跨域问题产生之后浏览器是禁止访问跨域资源的。这是由于浏览器的同源策略所造成的,是浏览器对javaScript施加的安全限制。
同源策略是指在如果访问的资源与当前的服务器的域名协议,域名,端口号有任意一个不同,则就认为是不同源的跨域访问
URL | 说明 | 是否允许通信 |
---|---|---|
http://www.a.com/a.js http://www.a.com/b.js | 同一域名下 | 允许 |
http://www.a.com/lab/a.js http://www.a.com/script/b.js | 同一域名下不同文件夹 | 允许 |
http://www.a.com:8000/a.js http://www.a.com/b.js | 同一域名,不同端口 | 不允许 |
http://www.a.com/a.js https://www.a.com/b.js | 同一域名,不同协议 | 不允许 |
http://www.a.com/a.js http://script.a.com/b.js | 主域相同,子域不同 | 不允许 |
http://www.a.com/a.js http://a.com/b.js | 同一域名,不同二级域名(同上) | 不允许(cookie这种情况下也不允许访问) |
http://www.cnblogs.com/a.js http://www.a.com/b.js | 不同域名 | 不允许 |
为什么有跨域问题的出现?
跨域是为了解决安全问题,如果一个域名可以访问任意的资源,那么该域名下的服务器就很容易受到来自恶意服务器的攻击
为什么要跨域?
在一个公司中的网络划分了不同的子域,比如一个是location.company.com ,而应用是放app.company.com, 这时想从 app.company.com去访问location.company.com 的资源就属于跨域。
如何解决跨域问题?
1.前端解决方法(此处不作讨论)
2.后端解决方法
跨域资源共享(CORS)
W3C 的 Web 工作组推荐了一种新的机制,即跨域资源共享(Cross-origin Resource Sharing),简CORS。其实这个机制就是实现了跨站访问控制
服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许ajax进行跨域的访问。
只需要在后台中加上响应头来允许域请求!在被请求的Response header中加入设置,就可以实现跨域访问
实现这一过程的最好方法就是在过滤器中对servlet的响应头中加上允许访问的数据,代码实现如下:
public class CorsFilter implements Filter {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
//允许携带Cookie时不能设置为* 否则前端报错
httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//允许所有请求跨域
httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等
httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookie
filterChain.doFilter(servletRequest, servletResponse);
}
}