开发者社区> elim1> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
全链路压测:影子库与影子表之争
在生产环境实施全链路压测的过程中,针对上文谈到的两种方案,又面临着数据隔离方案的选择问题,本文首先针对影子库、影子表两种方案进行介绍和对比,然后针对常见的场景,给出方案的选择建议。
1664 0
前端培训-中级阶段(4)- BOM浏览器对象模型(2019-07-04期)
前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 前面我们已经基本掌握常规的语法语义,以及基本的使用方法。接下来我们讲深入进去了解其中内在的原理。 上一节,我们聊了聊 BOM对象。这节我们来了解一下 BOM对象(浏览器对象)。 BOM对象其实就是我们的 window对象
19 0
前端培训-中级阶段(3)- DOM文档对象模型(2019-6 -27期)
前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 前面我们已经基本掌握常规的语法语义,以及基本的使用方法。接下来我们讲深入进去了解其中内在的原理。
20 0
C++ const常量对象、常量成员函数和常引用
C++ const常量对象、常量成员函数和常引用
27 0
OCP-052考试题库汇总(26)-CUUG内部解答版
Which three of these must be accessible to keep a database open? A)Control file. B)All members of a redo log group. C)SYSTEM tablespace. D)SYSAUX tablespace. E)spfile Answer: ABC 赵: 1 nomount:实例已经启动,进程和内存已经分配。
602 0
BREW 中的HTTP 开发
版权声明:本文为半吊子子全栈工匠(wireless_com,同公众号)原创文章,未经允许不得转载。 https://blog.csdn.net/wireless_com/article/details/6510398 IWeb接口的主要目的是为应用产生一个HTTP请求,对文件的请求使用HTTP中的“Get”方法,上载数据是通过HTTP的“Post”方法实现的 。
567 0
+关注
elim1
喜欢研究技术的码农
300
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载