JAX-RS开发(四):ajax跨域访问REST服务时的cors解决方案

上一篇博客我们通过JSONP解决AJAX跨域问题,本文将通过CORS来解决跨域问题。CORS是HTML5新推出的,需要较高版本的浏览器才能支持。我用的IE11和Chrome41,都是支持CORS规范的。cors可以参考下面几篇文章:

cors规范

http://www.w3.org/TR/cors/

cors浏览器兼容性

http://caniuse.com/#search=cors

tomcat7的cors解决方案

http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter

cors介绍

http://www.cnblogs.com/Darren_code/p/cors.html

如果使用的是Tomcat7+,那么可以使用它自带的过滤器,开启cros功能。只需要在web.xml下配置:

<filter>
	  <filter-name>CorsFilter</filter-name>
	  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
	  <filter-name>CorsFilter</filter-name>
	  <url-pattern>/*</url-pattern>
</filter-mapping>

如果不使用web容器的cors过滤器,那么可以在cxf-spring.xml中配置cxf的cros过滤器。

<?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/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://cxf.apache.org/jaxrs
	http://cxf.apache.org/schemas/jaxrs.xsd">

	<jaxrs:server address="/rest">
		<jaxrs:serviceBeans>
			<ref bean="nameServiceImpl"/>
		</jaxrs:serviceBeans>		

		<jaxrs:providers>
			<bean class="org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter">
			</bean>
		</jaxrs:providers>
	</jaxrs:server>
</beans>

这里特别注意:cxf的过滤器允许我们配置allowOrigins属性,用来设置允许那些域可以跨域访问。但是如果设置了这个属性,那么CXF在IE11下依然可以跨域访问,但是在Chrome下则无法跨域访问。不知道是什么原因。而tomcat提供的cors过滤器则没有这个问题。

最后附上跨域访问的js代码,可以看到跟正常js没有差别。

// 跨域访问
$.ajax({
		  type: 'get',
		  url: 'http://10.61.48.173:8080/aty-rest/rest/rest/welcome',
		  success: function(data) {
			alert(JSON.stringify(data));
		  }
});

最后附上几篇很不错的博客:

jsonp协议的实现原理

http://m.oschina.net/blog/204279

http://www.open-open.com/lib/view/open1388316392141.html

跨域问题的几种解决方案

http://segmentfault.com/a/1190000000718840





时间: 2024-12-05 06:24:20

JAX-RS开发(四):ajax跨域访问REST服务时的cors解决方案的相关文章

Ajax跨域访问wcf服务中所遇到的问题总结。

工具说明:vs2012,sql server 2008R2 1.首先,通过vs2012建立一个wcf服务项目,建立好之后.再新开一个vs2012 建立web项目,通过jQuery的ajax方法访问服务. 问题:由于web项目和wcf服务,不在同一个端口之中,所以涉及到“跨域”的问题.跨域访问的时候,需要对服务的接口和方法做一定的限定.具体参考:http://www.cnblogs.com/yangbingqi/p/2096197.html 2.解决了跨域问题,我们需要把服务部署到IIS.vs20

浅析JSONP-解决Ajax跨域访问问题

浅析JSONP-解决Ajax跨域访问问题 很久没有写随笔了,总是感觉没时间,其实时间就是...废话少说,前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现方法有多种,本例采用jQuery+Ajax,完成后,在本地调试了一切ok,但是部署到服务器上以后就出现问题了,后台服务调用没有响应,怎么回事?代码没怎么改动,唯一修改的地方就是jQuery的ajax方法中的url地址.难道是这里的问题,经过检查和调试,发现原来是同源策略在作怪,我们知道,JavaSc

CXF发布支持ajax跨域访问的restful webservice

用apache cxf构建了一个玩具型restful webservice,内嵌jetty,加上gradle,发布无比轻松. apply plugin: 'java' apply plugin: 'application' repositories { maven { url "http://maven.oschina.net/content/groups/public" } } [compileJava,compileTestJava,javadoc]*.options*.encod

Chrome浏览器开启Ajax跨域访问调试

由于浏览器安全性限制,Ajax是不能跨域访问的,而我们在日常开发工作中,经常会出现本地开发环境需要访问其他服务器上的API情况.提示信息为: Access to XMLHttpRequest at 'http://****' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. 在当今前后端分

Web Api 2(Cors)Ajax跨域访问

支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示 随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是两个Web网站项目了,前端项目主要负责界面的呈现和一些前端的相应业务逻辑处理,而Web Api则负责提供数据. 这样问题就来了,如果前端通过ajax访问Web Api项目话,就涉及到跨域了.我们知道,如果直接访问,

Access-Control-Allow-Origin:ajax 跨域访问

在使用jquery的$.ajax跨域访问的时候,如客户端域名是www.test.com,而服务器端是www.test2.com,在客户端通过ajax访问服务器端的资源将会报跨域错误: XMLHttpRequest cannot load http://www.test2.com/test.php. No 'Access-Control-Allow-Origin' header is present on the requested resource.Origin 'http://www.test

Jetty Cross Origin Filter解决jQuery Ajax跨域访问的方法

当使用jQuery Ajax post请求时可能会遇到类似这样的错误提示 XMLHttpRequest cannot oad http://xxxxxx. Origin http://xxxxxx is not allowed by Access-Control-Allow-Origin. 这是Ajax跨域访问权限的问题,服务器端不接受来自另一个不同IP地址的由脚本文件发出的http请求.解决这个问题需要在服务器端进行配置使服务器端可以接受来自不同域的脚本文件的http请求.一个简单的解决方法是

ajax跨域访问限制的突破

ajax跨域访问会遇到这个异常: XMLHttpRequest cannot load http://10.43.15.23/hnsh/rest/waterInfo/getRiverInfo.do. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. 通常的做法是用服

ajax跨域访问jsonp

ajax跨域访问: 1.前台: try{ $.ajax({ async:false, cache:false, data:{"vote_id":vote_id,"shareholder_card":shareholder_card,"stock_type":stock_type,"currency_type":currency_type}, url:sivrs_hasCard_url, dataType:'jsonp', js