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介绍

   跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源。而这种访问是被同源策略所禁止的。CORS系统定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求。 。

   简言之,CORS就是为了让AJAX可以实现可控的跨域访问而生的。

Tomcat下的配置

   下载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>org.ebaysf.web.cors.CORSFilter</filter-class>
     <init-param>
        <param-name>allowedOrigins</param-name>
        <param-value>*</param-value>
     </init-param>                    
     <init-param>
         <param-name>allowedHttpMethods</param-name>
         <param-value>GET, POST, HEAD, PUT, DELETE</param-value>
     </init-param>
     <init-param>
         <param-name>allowedHttpHeaders</param-name>
         <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value>
     </init-param>
    <init-param>
        <param-name>exposedHeaders</param-name>
        <param-value>Set-Cookie</param-value>
    </init-param>
 </filter> 
<filter-mapping> 
    <filter-name>CORS</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping>

    


在提供服务给另外一个系统使用时,如果不提供跨域支持,另外的那个系统在访问本系统提供的服务时会收到Access-Control-Allow-Origin类型的错误,并且访问失败。 添加跨域访问支持有两种简单的方式:一种是在所有头接口返回的response头中添加response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1/*");另外一种就是在本系统的web.xml中添加CORS支持。 CORS支持需要用到两个jar文件,分别是cors-filter-1.7.jar和java-property-utils-1.9.1.jar。 把他们放到工程的lib中,然后在web.xml中添加: < 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 >
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值