cxf 前端ajax 调用,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*.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)));

参考资料:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值