首页 > Web开发 > 详细

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

时间:2015-09-25 18:48:16      阅读:233      评论:0      收藏:0      [点我收藏+]

用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*.encoding = "UTF-8"

dependencies {
	compile ‘commons-lang:commons-lang:2.6‘
	compile ‘javax.ws.rs:javax.ws.rs-api:2.0.1‘
	compile ‘org.apache.cxf:cxf-rt-frontend-jaxrs:3.1.2‘
	compile ‘org.apache.cxf:cxf-rt-transports-http-jetty:3.1.2‘
	compile ‘org.apache.cxf:cxf-rt-rs-security-cors:3.1.3‘
	compile ‘com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.6.1‘
	compile ‘org.hsqldb:hsqldb:2.3.3‘
	compile ‘mysql:mysql-connector-java:5.1.35‘
	compile ‘org.hibernate:hibernate:3.5.4-Final‘
	compile ‘org.hibernate:hibernate-tools:4.3.1.Final‘
	compile ‘commons-httpclient:commons-httpclient:3.1‘
	testCompile group: ‘junit‘, name: ‘junit‘, version: ‘4.+‘
}

task "create-dirs" << {
   sourceSets*.java.srcDirs*.each { it.mkdirs() }
   sourceSets*.resources.srcDirs*.each { it.mkdirs() }
}

mainClassName = ‘cn.edu.hdu.grs.tdlab.Server‘

jar {
	version = "0.1.20150908-snapshot"
}

然后,要在这个基础上构建一些web页面,正好把最近学的angularJS搬出来用上。

这里就遇到一个问题,我angularJS的应用是部署在Apache Httpd上,于是就产生了一个ajax跨域访问问题。解决方式有两种:JSONP 和 CORS,我比较倾向于CORS。

那么是CXF框架下,添加响应头,最直接的想法是实现一个OutInterceptor。不过无意中发现,CXF已经给了解决方案:CrossOriginResourceSharingFilter。不过大多数中文博客都只提到要配置filter到provider中去,然后就没有然后了。(又要吐槽下,能不能靠谱点?)。试了下,没成功,于是果断上官网找资料,官网给了例子,CrossOriginResourceSharing注解到需要的地方,然后将filter配置到服务器中,恍然大悟。

接口如下:

@CrossOriginResourceSharing(
        allowOrigins = {
           "http://127.0.0.1"
        }, 
        allowCredentials = true, 
        maxAge = 1
)
@Path(value="/demand")
@Produces("application/json")
@Consumes("application/json")
public interface DemandService {
	@GET
	@Path(value="/{id}")
	public Demand get(@PathParam("id")int id);

	@GET
	@Path(value="/{id}/expert/")
	public List getRecommendExpert(@PathParam("id")int id);

	@POST
	@Path(value="/")
	public Map create(Demand demand,@HeaderParam("token")final String token);

	@GET
	@Path(value="/")
	public List list(@QueryParam("u")Integer uid, @QueryParam("s")int start,@QueryParam("l")int limit);
	
	@DELETE
	@Path(value="/{id}")
	public Demand delete(@PathParam("id")int id);
}

服务端部分代码如下:

JAXRSServerFactoryBean factoryBean = new JAXRSServerFactoryBean();
factoryBean.setResourceClasses(DemandServiceImpl.class);
JacksonJaxbJsonProvider jsonProvider = new JacksonJaxbJsonProvider();
CrossOriginResourceSharingFilter crossFilter = new CrossOriginResourceSharingFilter();
factoryBean.setProviders((Arrays.asList(crossFilter,jsonProvider)));


参考资料:

【1】JAX-RS: CORS项目官网 http://cxf.apache.org/docs/jax-rs-cors.html 

【2】使用 CORS 解决 AJAX 跨域问题 http://www.open-open.com/lib/view/open1423107683623.html 

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

原文:http://my.oschina.net/amhuman/blog/511317

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!