同源策略是指:協議、主機和連接埠都相同。我們可以在本地機器上部署2個不同連接埠的tomcat,讓一個tomcat下的應用通過ajax訪問另一個tomcat下的rest服務,這樣就存在跨域訪問問題了。修改conf/server.xml下面的三處連接埠號碼:
<Server port="****" shutdown="SHUTDOWN"> <Connector port="****" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="****" protocol="AJP/1.3" redirectPort="8443" />
在上一篇部落格的基礎上,為瞭解決cxf跨域問題需要:
1.修改pom檔案,增加providers
<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-rs-extension-providers</artifactId><version>${cxf.version}</version></dependency>
2.修改cxf-spring.xml配置jsonp攔截器
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jaxrs="http://cxf.apache.org/jaxrs"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://cxf.apache.org/jaxrshttp://cxf.apache.org/schemas/jaxrs.xsd"><jaxrs:server address="/rest"><jaxrs:serviceBeans><ref bean="nameServiceImpl"/></jaxrs:serviceBeans><!--jsonp--><jaxrs:providers><bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpPreStreamInterceptor"/></jaxrs:providers><jaxrs:inInterceptors><bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpInInterceptor"/></jaxrs:inInterceptors><jaxrs:outInterceptors><bean class="org.apache.cxf.jaxrs.provider.jsonp.JsonpPostStreamInterceptor"/></jaxrs:outInterceptors></jaxrs:server></beans>
3.在另一個tomcat下通過ajax訪問
$.ajax({ type: 'get', url: 'http://127.0.0.1:8080/aty-rest/rest/rest/welcome', dataType: 'jsonp', jsonp: '_jsonp', jsonpCallback: 'callback', success: function(data) {alert(JSON.stringify(data)); }});
本文參考了 Web Service 那點事兒(4)—— 使用 CXF 開發REST服務 這篇很不錯的入門文章。