CXF如何获取Http对象
2016-12-06 17:25
274 查看
有的时候我们可能需要在Webservice中获取Http元素,包括HttpServletRequest和HttpServletResponse等。虽然说通过Http协议进行传输的Webservice请求是运行在对应的Http环境下的,是包含HttpServletRequest、HttpServletResponse对象的,但是当我们使用Cxf时,这些都是被Cxf处理过的,我们是在Cxf封装的实现里面进行工作的,也就是说不能直接访问HttpServletRequest和HttpServletResponse对象。好在Cxf已经在接收到Http请求时已经将HttpServletRequest等对象保存起来了,我们可以在服务的实现过程中获取对应的Http对象。我们可以在两个地方获取当前请求相关的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);
}
}
@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对象的一点区别。
(注:本文是基于Cxf2.7.6所写)
(注:原创文章,转载请注明出处,原文地址:http://haohaoxuexi.iteye.com/blog/2264367)
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)
相关文章推荐
- 在portlet开发中,如何使用RenderRequest对象获取HttpServlertRequest中的值?求解答
- 【web开发问题】HTTP请求POSTDATA中包含多层对象如何获取?
- asp.net 5 如何使用ioc 以及在如何获取httpcontext对象
- 为什么获取的System.Web.HttpContext.Current值为null,HttpContext对象为null时如何获取程序(站点)的根目录
- cxf获取http对象地址
- 在STRUTS中如何通过request获取从HttpURLConnection写出的流对象
- CXF 拦截器,Feature, CXF 获取HTTP对象,JAX-WS的Handler
- JSF(Java Server Face) 框架中如何获取传统的HttpSession或HttpServletRequest对象
- Cxf中获取Http对象
- http://www.dewen.net.cn/q/6120/如何获取Java对象的大小
- 在STRUTS中如何通过request获取从HttpURLConnection写出的流对象
- 基于jersey的pojo对象如何获取HttpServletRequest对象
- XMLHttpRequest 对象如何支持 Ajax
- 获取 XMLDocument对象 和 XMLHttpRequest 对象的函数定义
- WPF中TreeView控件如何获取选中的TreeViewItem对象?
- WSS3SDK之:如何获取网站和站点集对象
- 如何使用HttpContext对象
- C++中如何获取对象的名字(变量名,注意不是类名)
- js如何获取当前页面字符编码? http://bbs.51js.com/thread-75687-1-1.html
- 如何创建XMLHTTPRequest对象