当前位置: 首页 > 知识库问答 >
问题:

HttpServletRequest。使用JAX-RPC在Weblogic 9.2.3上实现getRemoteAddr()

松秦斩
2023-03-14

敬礼,

我是WebLogicWebService实现方面的新手。尝试使用JAX-RPC从SOAP消息中获取客户端的远程地址。需要从SOAP消息头获取客户端的远程IP。根据BEA/Oracle文档,尝试了许多解决方案。WebService java文件:

@WebService
public class clientsIPWs {
    @Control
    private SoapMessageControl smc;

    @WebMethod
    @WebResult(name="return")
    public String getClientAddress() {
        return smc.getRemoteAddress();
    }

}

SoapMessageControl。Java语言

@ControlInterface
public interface SoapMessageControl {

    public String getRemoteAddress();

}

SoapMessageControlImpl.java

@ControlImplementation
public class SoapMessageControlImpl implements SoapMessageControl, Serializable {
    private static final long serialVersionUID = 1L;

    @Context
    private SOAPMessageContext smc;

    @WebMethod()
    public String getRemoteAddress() {
        HttpServletRequest request = 
            (HttpServletRequest) smc.getProperty("transport.http.servletRequest");
        return request.getRemoteAddr();
    }
}

在上一次测试中,尝试了许多类似于@Context的MessageContext/WebServiceContext的变体(这一个已被弃用),但每次测试都会收到这样的异常:

未能调用结束组件未能调用方法java。控件处的lang.NullPointerException。SoapMessageControlImpl。控件处的getRemoteAddress(SoapMessageControlImpl.java:33)。SoapMessageControlBean。服务上的getRemoteAddress(SoapMessageControlBean.java:119)。客户产品。sun上的getClientAddress(CustProdWs.java:63)。反映NativeMethodAccessorImpl。在sun调用0(本机方法)。反映NativeMethodAccessorImpl。在sun上调用(NativeMethodAccessorImpl.java:39)。反映DelegatingMethodAccessorImpl。在java上调用(DelegatingMethodAccessorImpl.java:25)。lang.reflect。方法在weblogic上调用(方法java:585)。wsee。组成部分波乔。JavaClassComponent。在weblogic上调用(JavaClassComponent.java:99)。wsee。ws。派遣服务器ComponentHandler。weblogic上的HandlerRequest(ComponentHandler.java:64)。wsee。处理程序。HandlerIterator。weblogic上的HandlerRequest(HandlerIterator.java:127)。wsee。ws。派遣服务器服务器调度程序。weblogic上的dispatch(ServerDispatcher.java:85)。wsee。ws。WsSkel。在weblogic上调用(WsSkel.java:80)。wsee。服务器servlet。SoapProcessor。weblogic上的handlePost(SoapProcessor.java:66)。wsee。服务器servlet。SoapProcessor。weblogic上的进程(SoapProcessor.java:44)。wsee。服务器servlet。BaseWSServlet$AuthorizedInvoke。在weblogic上运行(BaseWSServlet.java:181)。wsee。服务器servlet。BaseWSServlet。javax上的服务(BaseWSServlet.java:92)。servlet。http。HttpServlet。weblogic上的服务(HttpServlet.java:856)。servlet。内部的StubSecurityHelper$ServletServiceAction。在weblogic上运行(StubSecurityHelper.java:227)。servlet。内部的StubSecurityHelper。weblogic上的invokeServlet(StubSecurityHelper.java:125)。servlet。内部的ServletStubImpl。在weblogic上执行(ServletStubImpl.java:283)。servlet。内部的ServletStubImpl。在weblogic上执行(ServletStubImpl.java:175)。servlet。内部的WebAppServletContext$ServletinLocationAction。在weblogic上运行(WebAppServletContext.java:3244)。安全国际计算语言学协会。内部的AuthenticatedSubject。weblogic上的doAs(AuthenticatedSubject.java:321)。安全服务SecurityManager。weblogic上的runAs(SecurityManager.java:121)。servlet。内部的WebAppServletContext。weblogic上的securedExecute(WebAppServletContext.java:2010)。servlet。内部的WebAppServletContext。在weblogic上执行(WebAppServletContext.java:1916)。servlet。内部的ServletRequestImpl。在weblogic上运行(ServletRequestImpl.java:1366)。工作执行读取。在weblogic上执行(ExecuteThread.java:209)。工作ExecuteThread。运行(ExecuteThread.java:181)

google中,几乎每个解决方案都使用JAX-WS,这在这个框架中对我来说是不可用的。谢谢。

共有1个答案

郝昊东
2023-03-14

此解决方案对我有效:

获取HttpServletRequest/响应对象

如果Web服务使用HTTP作为其传输协议,则可以使用weblogic。wsee。联系运输servlet。获取javax的HttpTransportUtils API。servlet。http。HttpServletRequest和javax。servlet。http。来自JAX-RPC ServletEndpointContext对象的HttpServletResponse对象,如以下示例所示(相关代码以粗体显示,并在示例后解释):

 package examples.webservices.http_transport_utils;
 import javax.xml.rpc.server.ServiceLifecycle;
import javax.xml.rpc.server.ServletEndpointContext;
import javax.xml.rpc.ServiceException;
 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 import javax.jws.WebMethod;
import javax.jws.WebService;
 import weblogic.jws.WLHttpTransport;
 import weblogic.wsee.connection.transport.servlet.HttpTransportUtils;
 @WebService(name="HttpTransportUtilsPortType",
            serviceName="HttpTransportUtilsService",
            targetNamespace="http://example.org")
 @WLHttpTransport(contextPath="servlet", serviceUri="HttpTransportUtils",
                 portName="HttpTransportUtilsPort")
 public class HttpTransportUtilsImpl implements ServiceLifecycle {
   private ServletEndpointContext wsctx = null;
   public void init(Object context) throws ServiceException {
    System.out.println("ServletEndpointContext inited...");
    wsctx = (ServletEndpointContext)context;
  }
   public void destroy() {
    System.out.println("ServletEndpointContext destroyed...");
    wsctx = null;
  }
   @WebMethod()
  public String getServletRequestAndResponse() {
     HttpServletRequest request =
       HttpTransportUtils.getHttpServletRequest(wsctx.getMessageContext());
    HttpServletResponse response =
       HttpTransportUtils.getHttpServletResponse(wsctx.getMessageContext());
     System.out.println("HttpTransportUtils API used successfully.");
    return "HttpTransportUtils API used successfully";
   }
 }
 类似资料:
  • 问题内容: 我使用AppFuse创建了一个基本的应用程序外壳,并按照AppFuse教程使用Jax- RS创建了一个简单的RESTful服务。那很好。调用时,将Person对象的集合作为Json格式的字符串返回,并带有正确的数据。 我现在想从Appfuse提供的RESTful服务中访问和对象(以使用需要这些对象的另一个库)。 我 _认为_应该可以通过添加@Context注释来实现,但是,如果我添加@

  • 我有一个简单的客户端和服务器设置。客户端希望在服务器中使用ZeroMQ执行通信方法。我将使用REQ和REP套接字,因为它们适合这个用例。然而,我对protobuf的定义有疑问。我认为这两个选项可用于实现目标: 其中“control”包含要远程执行的方法的名称。另一种选择可以是: 最好的方法是什么?或者至少使用一种方法而不是另一种方法的权衡是什么?

  • 我正在使用Apache Tomcat v6服务器。在创建新的网络服务时,我获得了“Apache Axis”、“Apache Axis2”和“Apache CXF2. x”的网络服务运行时选项。 是否可以将运行时设置为“JAX-RPC”或“JAX WS”? 编辑: 我正在使用Eclipse IDE

  • 我将rest服务配置为通过Variant实现内容协商。在jersey上一切正常,但在apache cxf上有些问题。 找不到类ContentType:Application/XML的消息正文编写器 当我将响应构造为xml类型时,似乎找不到正确的正文编写器。

  • 创建JAX-WS示例是一项简单的任务,因为它不需要额外的配置设置。 JAX-WS API内置于JDK中,因此无需为其加载任何额外的jar文件。 让我们看一下RPC样式的JAX-WS简单示例。 创建一个Java项目:JAXWSHelloworld,在这个项目中创建了4个文件: HelloWorld.java HelloWorldImpl.java Publisher.java HelloWorldC

  • 问题内容: 我正在尝试使用异步响应构建REST Web服务。 我已经在网上解决了这个错误,但是,没有一种解决方案对我有用。我不确定如何去做。 这是REST服务的代码,它具有AsyncResponse,并且取自,我将在下面提供该文件中指定的jar文件。问题是,在部署战争时,我遇到一个例外: 我的课如下: 我的Maven文件如下: 问题答案: 是 当应用程序试图调用一个抽象方法抛出 。 是中的抽象方法