Cxf获取Http对象
目录
有的时候我们可能需要在Webservice中获取Http元素,包括HttpServletRequest和HttpServletResponse等。虽然说通过Http协议进行传输的Webservice请求是运行在对应的Http环境下的,是包含HttpServletRequest、HttpServletResponse对象的,但是当我们使用Cxf时,这些都是被Cxf处理过的,我们是在Cxf封装的实现里面进行工作的,也就是说不能直接访问HttpServletRequest和HttpServletResponse对象。好在Cxf已经在接收到Http请求时已经将HttpServletRequest等对象保存起来了,我们可以在服务的实现过程中获取对应的Http对象。我们可以在两个地方获取当前请求相关的Http对象,服务实现类中和拦截器中。
1.1 服务实现类中
当我们需要在服务实现类中获取Http对象时,主要有两种方式,通过MessageContext获取和通过Message获取。
1.1.1通过MessageContext获取
通过MessageContext获取时,我们需要给服务实现类定义一个WebServiceContext类型的属性,并使用@Resource进行标注。这样当请求到来时Cxf将为我们给该属性注入对应的对象。通过WebServiceContext对象我们就可以获取到对应的MessageContext对象了,然后就可以从其中获取到HttpServletRequest等Http对象。
@WebService
public class HelloWorldServiceImpl implements HelloWorldService {
@Resource
private WebServiceContext context;
public void sayHello(String who) {
MessageContext messageContext = context.getMessageContext();
//获取request
HttpServletRequest request = (HttpServletRequest) messageContext.get(MessageContext.SERVLET_REQUEST);
//或者通过如下方式获取,AbstractHTTPDestination.HTTP_REQUEST和MessageContext.SERVLET_REQUEST这两个常量值是不一样的,
//但它们对应于MessageContext对象中存储的都是HttpServletRequest对象
// HttpServletRequest request = (HttpServletRequest) messageContext.get(AbstractHTTPDestination.HTTP_REQUEST);
//获取response
HttpServletResponse response = (HttpServletResponse) messageContext.get(MessageContext.SERVLET_RESPONSE);
//获取ServletContext
ServletContext servletContext = (ServletContext) messageContext.get(MessageContext.SERVLET_CONTEXT);
}
}
1.1.2通过Message获取
Message也有类似MessageContext的get方法,可以获取到所需要的Http对象,对应的Key可以通过AbstractHTTPDestination中定义的常量来获取。关键在于我们在服务实现类中如何获取到当前服务请求时对应的Message对象呢?我们知道Cxf是有拦截器的,Cxf里面的很多功能都是通过拦截器来实现的。在进行请求处理时Cxf会将当前消息存到一个线程变量中,这个对象我们可以通过PhaseInterceptorChain的静态方法getCurrentMessage取到当前请求对应的Message对象,然后就可以从Message对象中获取对应的Http对象了。
@WebService
public class HelloWorldServiceImpl implements HelloWorldService {
public void sayHello(String who) {
Message message = PhaseInterceptorChain.getCurrentMessage();
//获取request
HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);
//获取response
HttpServletResponse response = (HttpServletResponse) message.get(AbstractHTTPDestination.HTTP_RESPONSE);
//获取ServletContext
ServletContext servletContext = (ServletContext) message.get(AbstractHTTPDestination.HTTP_CONTEXT);
}
}
需要注意的一点是在从Message对象中获取Http对象时,只能通过AbstractHTTPDestination类中定义的常量来获取,而不能通过MessageContext中定义的常量来获取,这是通过Message对象获取Http对象和通过MessageContext对象获取Http对象的一点区别。
1.2 拦截器中
在拦截器中获取Http对象,其实也是通过Message对象来获取的,只是因为拦截器中拦截的本来就是Message,我们可以非常轻易的获取到Message对象,并从其中获取Http对象。这里就不再赘述了。
(注:本文是基于Cxf2.7.6所写)
(注:原创文章,转载请注明出处,原文地址:http://haohaoxuexi.iteye.com/blog/2264367)
相关推荐
对于CXF客户端,可以使用`javax.ws.rs.client.ClientBuilder`创建一个客户端实例,然后通过`target()`方法指定服务地址,`register()`方法注册JSON处理类,最后调用`invoke()`方法发起请求并获取JSON响应。...
在这个场景中,"CXF服务端对象文件支持断点传送"指的是CXF服务端具有处理文件传输的能力,并且这种能力包含了对断点传输的支持。断点传输是一种允许用户中断并恢复文件传输的技术,特别适用于大文件的上传和下载,以...
4. **cxf-rt-bindings-soap**: 提供了SOAP绑定,负责将XML消息转换为Java对象,反之亦然。 5. **cxf-rt-wsdl**: 解析并处理WSDL(Web Service Description Language),这是定义Web服务接口的标准语言。 6. **cxf-...
- `jaxb-api.jar`和相关实现(如`jaxb-impl.jar`, `jaxb-runtime.jar`):提供了Java对象到XML数据的绑定,是JAX-WS服务的基础。 - `wsdl4j.jar`:用于处理WSDL文档,是定义和解析Web服务接口的关键。 4. **运行...
Apache CXF是一个开源的Java...不过,值得注意的是,由于这是较早的版本,可能不包含后来添加的一些新特性和修复的安全漏洞,因此在生产环境中,你可能需要考虑升级到更现代的CXF版本,以获取最新的功能和安全改进。
最后,启动Spring应用,你就可以通过浏览器或HTTP客户端访问如"http://localhost:8080/services/person?id=1"这样的URL,获取XML或JSON格式的Person数据了。 总结一下,通过CXF 2.6与Spring的集成,我们可以轻松地...
- CXF使用JAXB(Java Architecture for XML Binding)将XML配置转换为Java对象,以便进一步处理。 2. **服务代理创建**: - 根据配置信息,CXF会生成一个服务代理类,这个代理类实现了服务接口。这个代理类是...
4. **处理HTTP头信息**:CXF提供了拦截器(Interceptor)机制,可以通过自定义拦截器来读取和操作HTTP头。在`frontend/client`或`frontend/server`的拦截器链中添加自定义拦截器,拦截器可以访问并处理Message对象中...
3. **数据绑定**:CXF 提供JAXB(Java Architecture for XML Binding)和JAX-BT(Java API for XML-based Web Services with Attachments)数据绑定,使得Java对象可以直接与XML消息交互。 4. **协议栈**:CXF支持...
3. **数据绑定**:CXF支持JAXB(Java Architecture for XML Binding)和XMLBeans,用于将Java对象转换为XML和反之亦然。 4. **互操作性**:由于CXF实现了多种Web服务标准,如WSDL 2.0、WS-I BP 1.1、WS-Security等...
1. 获取服务代理:CXF提供了ClientProxyFactoryBean,可以生成一个服务接口的代理对象,这个代理对象能透明地调用远程服务。 2. 配置服务地址:设置服务代理的终结点URL,指明要调用的服务的位置。 3. 调用服务:...
- 自动发现WSDL:如果服务提供者没有提供WSDL,CXF可以通过服务地址自动获取WSDL。 - 安全性:CXF支持多种安全机制,如基本认证、 Digest认证、WS-Security等,可以通过配置文件或代码实现。 五、高级特性 1. 异步...
3. **数据绑定**:CXF提供了XML到Java对象(JAXB)和Java对象到XML(XSD)的数据绑定,简化了服务接口和实现之间的转换。 4. **WS-*兼容性**:CXF实现了许多Web服务标准,如WS-Security、WS-ReliableMessaging等,...
3. **cxf-rt-wsdl.jar**:WSDL(Web Service Description Language)解析库,用于读取和处理WSDL文件,以便生成服务端点和服务客户端代理。 4. **cxf-rt-bindings-soap.jar**:提供SOAP绑定支持,使得CXF能够将SOAP...
这个压缩包"apache-cxf-2.7.6"包含了该版本的所有组件和资源,使得开发者能够方便地实现基于SOAP(简单对象访问协议)和RESTful(表述性状态转移)的Web服务。 CXF这个名字是"CXF = XFire + Celtix"的合并,这两个...
在这个实例中,我们可能会看到如何使用CXF来创建一个可以获取天气预报信息的Web服务。 首先,我们需要了解Web服务的基本工作原理。Web服务通常通过WSDL(Web Services Description Language)文件来定义其接口,该...
现在你可以通过代理对象调用服务端的方法,传入必要的参数,并接收返回结果。 ```java Response response = port.myMethod(requestObject); ``` #### 7. 错误处理和资源释放 在调用完成后,别忘了清理和关闭资源...
4. **数据绑定**:CXF支持多种数据绑定机制,如JAXB,用于自动序列化和反序列化Java对象到XML或JSON。 5. **部署和测试**:将资源类部署到CXF服务器,使用HTTP客户端进行测试。 【Spring与CXF的整合】 Spring是一...
- **数据绑定**:帮助将XML消息自动映射到Java对象,反之亦然,减少手动处理XML的复杂性。 - **错误处理**:提供异常处理机制,便于捕获和处理服务调用中的错误。 4. **使用CXF工具类的步骤** - **添加依赖**:...
CXF是一个开源的Java框架,它支持构建和部署SOAP(简单对象访问协议)和RESTful(Representational State Transfer)Web服务。CXF提供了丰富的功能,包括WSDL(Web服务描述语言)第一类公民支持、强大的数据绑定、...