做Web应用开发的,一定都遇到过或者至少听说过JS跨域这个问题。今天我们来看看这个问题的产生原因,以及在Tomcat中的解决方式。
说到跨域时,首先需要了解下浏览器的同源策略(Same orgin policy)。
那到底哪种情况下算同源,哪些情况下算跨域呢?
以下面这个URL
http://www.example.com/dir/page.html
这个URL为例,是否同源如下图所示
(上图来自维基百科)
而在跨域请求的时候,打开浏览器的开发者工具,会看到这行错误信息
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.xxx.xxx' is therefore not allowed access.
也就是说如果要实现跨域请求,是需要服务器端明确指定的。例如我们自己开发的Servlet,要支持这种跨域请求,需要在响应头中增加如下配置
response.setHeader("Access-Control-Allow-Origin","*");
当然,真实的线上应用把星号改成对应要允许的域名即可。
而为了处理跨域的需求,Tomcat其实也包含一个特定的Filter:
org.apache.catalina.filters.CorsFilter
由于跨域资源共享英文称之为(Cross-Origin Resource Sharing),简称是CORS,在这个Filter中,我们可以定义一系列的初始参数initParam
cors.allowed.origins
cors.allowed.methods
cors.allowed.headers
...
这一系列配置可以实现我们自己代码需要的全部功能,但更集中,方便使用。例如第一个参数可以配置允许的域有哪些,默认为星,可以指定多个域名,逗号分隔
第二个参数可以指定哪些请求方法允许使用,例如GET/POST/PUT。。。
官方文档对其功能描述如下:
This