Cxf获取Http对象

简介: Cxf获取Http对象   目录 1.1        服务实现类中 1.1.1         通过MessageContext获取 1.1.2         通过Message获取 1.2        拦截器中            有的时候我们可能需要在Webservice中获取Http元素,包括HttpServletRequest和HttpServletResponse等。

Cxf获取Http对象

 

目录

1.1        服务实现类中

1.1.1         通过MessageContext获取

1.1.2         通过Message获取

1.2        拦截器中

 

         有的时候我们可能需要在Webservice中获取Http元素,包括HttpServletRequestHttpServletResponse等。虽然说通过Http协议进行传输的Webservice请求是运行在对应的Http环境下的,是包含HttpServletRequestHttpServletResponse对象的,但是当我们使用Cxf时,这些都是被Cxf处理过的,我们是在Cxf封装的实现里面进行工作的,也就是说不能直接访问HttpServletRequestHttpServletResponse对象。好在Cxf已经在接收到Http请求时已经将HttpServletRequest等对象保存起来了,我们可以在服务的实现过程中获取对应的Http对象。我们可以在两个地方获取当前请求相关的Http对象,服务实现类中和拦截器中。

 

1.1     服务实现类中

         当我们需要在服务实现类中获取Http对象时,主要有两种方式,通过MessageContext获取和通过Message获取。

 

1.1.1通过MessageContext获取

         通过MessageContext获取时,我们需要给服务实现类定义一个WebServiceContext类型的属性,并使用@Resource进行标注。这样当请求到来时Cxf将为我们给该属性注入对应的对象。通过WebServiceContext对象我们就可以获取到对应的MessageContext对象了,然后就可以从其中获取到HttpServletRequestHttp对象。

 

@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_REQUESTMessageContext.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也有类似MessageContextget方法,可以获取到所需要的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

 

目录
相关文章
HTTP协议:响应消息和 Response对象和ServletContext对象
HTTP协议:响应消息和 Response对象和ServletContext对象
|
存储 Go
第十七章 CSP 中的 HTTP 请求 - %CSP.Response 对象和 OnPreHTTP 方法
第十七章 CSP 中的 HTTP 请求 - %CSP.Response 对象和 OnPreHTTP 方法
|
存储 Go 数据库
第十六章 CSP 中的 HTTP 请求 - %CSP.Request 对象
第十六章 CSP 中的 HTTP 请求 - %CSP.Request 对象
|
Dart
【Flutter】HTTP 网络操作 ( 引入 http 插件 | 测试网站 | Get 请求 | Post 请求 | 将响应结果转为 Dart 对象 | Future 异步调用 )(二)
【Flutter】HTTP 网络操作 ( 引入 http 插件 | 测试网站 | Get 请求 | Post 请求 | 将响应结果转为 Dart 对象 | Future 异步调用 )(二)
242 0
【Flutter】HTTP 网络操作 ( 引入 http 插件 | 测试网站 | Get 请求 | Post 请求 | 将响应结果转为 Dart 对象 | Future 异步调用 )(二)
|
存储 JSON Dart
【Flutter】HTTP 网络操作 ( 引入 http 插件 | 测试网站 | Get 请求 | Post 请求 | 将响应结果转为 Dart 对象 | Future 异步调用 )(一)
【Flutter】HTTP 网络操作 ( 引入 http 插件 | 测试网站 | Get 请求 | Post 请求 | 将响应结果转为 Dart 对象 | Future 异步调用 )(一)
389 0
【Flutter】HTTP 网络操作 ( 引入 http 插件 | 测试网站 | Get 请求 | Post 请求 | 将响应结果转为 Dart 对象 | Future 异步调用 )(一)
|
测试技术
为什么Spartacus单元测试里对http返回的Observable对象调用subscribe时,会触发依赖注入的框架代码
为什么Spartacus单元测试里对http返回的Observable对象调用subscribe时,会触发依赖注入的框架代码
为什么Spartacus单元测试里对http返回的Observable对象调用subscribe时,会触发依赖注入的框架代码