2016-12-13 6 views
0

Salut,HttpServletRequest.getRemoteAddr() la mise en œuvre sur Weblogic 9.2.3 en utilisant JAX-RPC

Je suis nouvelle dans la mise en œuvre Weblogic WebService. Essayer d'obtenir l'adresse distante du client à partir du message SOAP en utilisant JAX-RPC. Nécessité d'obtenir l'adresse IP distante du client à partir de l'en-tête du message SOAP. J'ai essayé de nombreuses solutions selon la documentation BEA/Oracle. WebService fichier 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(); 
    } 
} 

Dans le dernier a essayé de nombreuses variantes avec @Context comme MessageContext/WebServiceContext (celui-ci est obsolète), mais chaque fois que le test a reçu une telle exception:

Impossible d'invoquer le composant d'extrémité Impossible d'invoquer la méthode java.lang.NullPointerException à controls.SoapMessageControlImpl.getRemoteAddress (SoapMessageControlImpl.java:33) à controls.SoapMessageControlBean.getRemoteAddress (SoapMessageControlBean.java:119) à services .CustProdWs.getClientAddress (CustProdWs.java:63) à sun.reflect.NativeMethodAccessorImpl.invoke0 (Méthode natif) à sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) à sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) à java.lang.reflect.Method.invoke (Method.java:585) à weblogic.wsee.component.pojo.JavaClassComponent.invoke (JavaClassComponent.java:99) à weblogic.wsee.ws.dispatch.server.ComponentHandler.handleRequest (ComponentHandler.java:64) à weblogic.wsee.handler. HandlerIterator.handleRequest (HandlerIterator.java:127) à weblogic.wsee.ws.dispatch.server.ServerDispatcher.dispatch (ServerDispatcher.java:85) à weblogic.wsee.ws.WsSkel.invoke (WsSkel.java:80) à weblogic.wsee.server.servlet.SoapProcessor.handlePost (SoapProcessor.java:66) à weblogic.wsee.server.servlet.SoapProcessor.process (SoapProcessor.java:44) à weblogic.wsee.server.servlet. BaseWSServlet $ AuthorizedInvoke.run (BaseWSServlet.java:181) at weblogic.wsee.server.servlet.BaseWSServlet.service (BaseWSServlet.java : 92) à javax.servlet.http.HttpServlet.service (HttpServlet.java:856) à weblogic.servlet.internal.StubSecurityHelper $ ServletServiceAction.run (StubSecurityHelper.java:227) à weblogic.servlet.internal.StubSecurityHelper .invokeServlet (StubSecurityHelper.java:125) à weblogic.servlet.internal.ServletStubImpl.execute (ServletStubImpl.java:283) à weblogic.servlet.internal.ServletStubImpl.execute (ServletStubImpl.java:175) à weblogic.servlet .internal.WebAppServletContext $ ServletInvocationAction.run (WebAppServletContext.java:3244) at weblogic.security.acl.internal.AuthenticatedSubject.doAs (AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs (SecurityManager.java : 121) à weblogic.servlet.internal.WebAppServletContext.securedExecute (WebAppServletContext.java:2010) à weblogic.servlet.internal.WebAppServletContext.execute (WebAppServletContext.java:1916) à weblogic.servlet.internal.ServletRequestImpl.run (ServletRequestImpl. java: 1366) à weblogic.work.ExecuteThread.execute (ExecuteThread.java: 209) à weblogic.work.ExecuteThread.run (ExecuteThread.java:181)

Google utilise presque toutes les solutions JAX-WS qui n'est pas disponible pour moi dans ce cadre. Merci.

Répondre

0

Cette solution a fonctionné pour moi:

Obtenir le HttpServletRequest/Réponse objet

Si votre service Web utilise HTTP comme protocole de transport, vous pouvez utiliser le weblogic.wsee.connection.transport. servlet.HttpTransportUtils API pour obtenir le javax.servlet.http.HttpServletRequest et objets javax.servlet.http.HttpServletResponse du JAX-RPC objet ServletEndpointContext, comme le montre l'exemple suivant (code correspondant indiqué dans b ancien et expliqué après l'exemple):

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"; 
    } 
}