【问题标题】:Apache CXF Request/ResponseApache CXF 请求/响应
【发布时间】:2013-08-22 18:47:10
【问题描述】:

我正在开发一个应用程序,当它进入 CXFServlet 时,我想用它来捕获 SOAP 请求。在 CXFServlet 处理之前,我需要对服务器端的 SOAP 信封进行一些处理。

我一直假设 SOAP 信封一旦到达服务器端,就是 HTTPServletRequest 对象中的参数之一。但是看看进来的东西(当然是使用调试器),我找不到它。

当客户端将 SOAP 请求发送到服务器时,有人能告诉我 SOAP 请求去哪里了吗?我知道客户端正在使用 HTTP POST 发送请求,并且我知道服务器正在使用请求中的信息来访问适当的 Web 服务方法,然后将来自该方法的任何返回值放入 SOAP 响应并返回它给客户。我需要知道的是 CXFServlet(或其过滤器之一)在哪里查看以获取 SOAP 信息?它在参数中的某个地方吗?在 servlet 上下文中?过滤器是否会在 SOAP 信息到达 CXFServlet 之前对其进行处理?如何在调用 Web 服务方法之前获取该信封并对其执行操作?

请高人指教……

【问题讨论】:

  • 你想访问原始请求吗?

标签: web-services http servlets soap cxf


【解决方案1】:

您想访问原始请求吗?如果是,则可以使用 WebServiceContext 对象访问实际的请求或响应对象本身。

首先,在你的服务实现中为 WebServiceContext 声明一个私有字段,并将其注解为资源

@资源 私有 WebServiceContext 上下文;

然后,在您的实现方法中,您可以访问 MessageContext、HttpServletRequest 和 HttpServletResponse,如下所示:

MessageContext ctx = context.getMessageContext();

HttpServletRequest 请求 = (HttpServletRequest)ctx.get(AbstractHTTPDestination.HTTP_REQUEST);

有关 WebServiceContext 的更多信息,请参见以下网址: http://docs.oracle.com/javase/6/docs/api/javax/xml/ws/WebServiceContext.html

【讨论】:

    【解决方案2】:

    如果您需要在 CXFServlet 处理之前拦截请求,您应该考虑开发一个 Servlet Filter

    如果您只想在 CXF 之前处理 SOAP 消息,您可以使用CXF Interceptor。文档中提到的阶段指示您可以截获消息的点。根据您想要做/更改的内容,您可能需要玩转各个阶段。

    CXF 的SoapHeaderInterceptorSoapActionInInterceptor 的来源是开始了解如何使用 SOAP 消息的好地方。

    【讨论】:

    • Patrick:你已经接近我要找的东西了,但我应该更准确地说:我想做的是向 servlet 发送一个请求,它会进行一些处理并“注入”一个 SOAP将信封放入 CXFServlet。这个想法是 CXF 应该像往常一样处理 SOAP 信封,但我是从另一个 servlet 生成该信封。 CXF 可以做到这一点吗?
    • 接收请求的 Servlet 是否有任何理由不能简单地充当 CXF Web 服务的 jaxws 客户端?这似乎是一种更简单的方法。您还可以尝试使用 CXF 拦截器在 CXF 开始处理之前修改消息的输入流。我不确定将 SOAP 信封“注入”到 CXFServlet 中意味着什么。或许您可以描述一下您要解决的问题?
    • 其实,是的。我需要直接操作 SOAP 信封,并且在某些情况下,需要创建自定义 SOAP 请求。这个想法是非 SOAP 请求发送到 Servlet A,Servlet A 生成请求,然后将其转发给 CXFServlet。或者客户端向 Servlet B 发送一个 SOAP 请求,Servlet B 进行一些修改和添加,然后将修改后的请求转发给 CXFServlet。重要的是 SOAP 信封的直接操作,独立于 CXFServlet——这是我不能用 servlet 客户端或拦截器做的事情......
    • 使用 ActionIntercepters 甚至 HeaderIntercepters 来做我需要的事情只适用于已经正确形成的 SOAP 信封。在许多情况下,我不会使用 SOAP 客户端与服务通信。我需要一个可以在 CXFServlet 甚至看到它之前 生成或更改 SOAP 信息的中介。 SOAP 信封的必要操作也使得使用 servlet 作为 CXFServlet 的客户端变得不可行。 SOAP 客户端只能调用该服务。另外:CXFServlet 和我的中介必须在同一台机器上运行。
    • CXF Raw SOAP Envelope via Interceptor 上查看这篇文章。拦截器可以在原始数据作为 SOAP 消息处理之前对其进行修改。此数据可能以 SOAP 消息以外的形式开始,因为您很早就捕获它,并使用拦截器将其转换为 SOAP 消息。实际上手动创建 SOAP 消息是另一个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多