Ajax 跨域访问 tomcat 下的 web service
2016-03-24 08:44
447 查看
Ajax 跨域访问 tomcat 下的 web service
当用 Ajax 跨域访问发布在 Tomcat 下的 web service时 ,会出现如下的错误。XMLHttpRequest cannot load http://localhost:8081/DistServices/services/FolderService/GetAllFolderTypes.
No 'Access-Control-Allow-Origin'header is present on the requested resource. Origin 'http://localhost:9206' istherefore not allowed access。
这个问题的产生是由于跨域访问时,request 来自的域(http://localhost:9206)不在服务(http://localhost:8081)所接受的域列表里面。说人话就是,哥的服务不是你想要就要得,没经过我的批准,你没法使用。就好像你去按摩店:"老板,来个漂亮妹子给我按摩。"。你想要这些服务,不给钱是不行的。
因此,要是想跨域访问这个服务,我们得经过服务发布者(老板)的允许,将我们发起请求的域加到服务器允许访问的域列表里面。问题知道了,那怎么做呢?
从上面的描述可以看出,工作主要在服务端,只要服务发布者允许,请求者就可以正常访问了,因此服务发布者需要做一些工作来达到这个目的。
CORS介绍
跨域[b][b]资源共享[/b](CORS[/b] )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源。而这种访问是被同源策略所禁止的。CORS系统定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。 。
简言之,CORS就是为了让AJAX可以实现可控的跨域访问而生的。
Tomcat下的[b]配置[/b]
下载cors-filter-2.3.jar(其它版本也可),java-property-utils-1.9.jar这两个库文件,放到lib目录下。工程项目中web.xml中的配置如下:
1、加载 CORSFilter
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
</filter>
如果需要动态监测过滤规则的变化,那么应该使用如下的配置代替上面的配置(实际上就是使用另外一种类型的CORSFilter):
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.autoreconf.AutoReconfigurableCORSFilter</filter-class>
</filter>
2、指定规则
如果只允许来自某个域(http://localhost:9206)的请求,那么给CORSFilter加如下参数:
<init-param>
<param-name>cors.allowOrigin</param-name>
<param-value>http://localhost:9206</param-value>
</init-param>
如果允许同时来自两个域(http://localhost:9206 和 http://chenyp.com)的请求,那么给CORSFilter加如下参数:
<init-param>
<param-name>cors.allowOrigin</param-name>
<param-value>http://localhost:9206,http://chenyp.com</param-value>
</init-param>
如果允许来自任何域的请求,那么给CORSFilter加如下参数:
<init-param>
<param-name>cors.allowOrigin</param-name>
<param-value>*</param-value>
</init-param>
其它可配的参数还有:
<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>GET, POST, HEAD, PUT, DELETE</param-value>
</init-param>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value>
</init-param>
<init-param>
<param-name>cors.exposedHeaders</param-name>
<param-value>Set-Cookie</param-value>
</init-param>
<init-param>
<param-name>cors.supportsCredentials</param-name>
<param-value>true</param-value>
</init-param>
如果不清楚这些参数所代表的意义,那么你可能需要了解下 HTTP请求报文。
3、指定需要过滤的请求
如果只对某个servlet 过滤,那么如下配置:
<filter-mapping>
<filter-name>CORS</filter-name>
<servlet-name>MyServlet</servlet-name>
</filter-mapping>
如果需要对所有的请求过滤,那么如下配置:
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这就是所有的配置了,一个完整的配置可能如下:
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<param-name>cors.allowOrigin</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>GET, POST, HEAD, PUT, DELETE</param-value>
</init-param>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value>
</init-param>
<init-param>
<param-name>cors.exposedHeaders</param-name>
<param-value>Set-Cookie</param-value>
</init-param>
<init-param>
<param-name>cors.supportsCredentials</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
除了这种类型的 CORSFilter ,Apache 也提供了用于同样目的的CORSFilter 类,原理和配置大同小异,有兴趣的可以看这里:http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter
既然是一个Filter,那么我们自己也是可以编写对应的CORSFilter 类的,我在这里编写一个最简单的 CORSFilter:
public class CORSFilter implements Filter {
private FilterConfig _CONFIG=null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
_CONFIG=filterConfig;
}
@Override
public void doFilter(ServletRequest request,ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (_CONFIG!=null){
Enumeration names = _CONFIG.getInitParameterNames();
String name=null;
String value=null;
while (names.hasMoreElements()){
name=(String)names.nextElement();
value=_CONFIG.getInitParameter(name);
((HttpServletResponse)response).addHeader(name,value);
}
}
chain.doFilter(request,response);
}
@Override
public void destroy() {
_CONFIG=null;
}
}
对应的配置如下:
<filter>
<filter-name>CORSFilter</filter-name>
<filter-class>dist.filter.CORSFilter</filter-class>
<init-param>
<param-name>Access-Control-Allow-Origin</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>Access-Control-Allow-Headers</param-name>
<param-value>Origin, X-Requested-With, Content-Type, Accept</param-value>
</init-param>
<init-param>
<param-name>Access-Control-Allow-Methods</param-name>
<param-value>GET, POST, HEAD, PUT, DELETE</param-value>
</init-param>
<!-- 还可以继续配置其它参数 -->
</filter>
<filter-mapping>
<filter-name>CORSFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
不足之处,烦请指正!!
相关文章推荐
- 搭建好solr,启动tomcat,报错Error loading class "solr.VelocityResponseWriter"
- Tomcat 7.x下jspspy无法使用的解决方法
- tomcat 常见启动问题小记
- 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出
- tomcat报严重: Socket accept failed
- 解决表单乱码问题之一,修改tomcat默认编码格式
- Tomcat设置默认启动项目及Java Web工程设置默认启动页面
- 如何进入tomcat的管理页面
- Tomcat7.0安装配置
- tomcat监控工具
- eclipse中tomcat 中server location灰色,如何修改?
- tomcat启动死循环
- JavaWeb基础之tomcat部署
- ubuntu 14.04 开机启动多个tomcat
- TOMCAT debug
- tomcat 设置项目 密码登陆
- tomcat 8.0 SQLSERVER 数据库连接池的创建方法
- 在linux上使用tomcat
- eclipse配置成功tomcat,但是访问一直是404
- 利用rsync服务定时同步tomcat日志