Реализация HttpServletRequest.getRemoteAddr() в Weblogic 9.2.3 с использованием JAX-RPC
Салют,
Я новичок в реализации Weblogic WebService. Попытка получить удаленный адрес клиента из сообщения SOAP с использованием JAX-RPC. Необходимо получить удаленный IP-адрес клиента из заголовка сообщения SOAP. Перепробовал множество решений в соответствии с документацией BEA/Oracle. Java-файл WebService:
@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 в элементах управления.:63) в sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) в sun.reflect.DelegatingMethodAccessorImplan.gho.jjj.jj refle.Method.invoke(Method.java:585) на weblogic.wsee.component.pojo.JavaClassComponent.invoke(JavaClassComponent.java:99) на weblogic.wsee.ws.dispatch.server.ComponentHandler.handleRequest(ComponentHand.ler). 64) на weblogic.wsee.handler.HandlerIterator.handleRequest(HandlerIterator.java:127) на weblogic.wsee.ws.dispatch.server.ServerDispatcher.dispatch(ServerDispatcher.java:85) на weblogic.wsee.ws.WsSkelin (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. запустить (BaseWSServlet.java:181) в weblogic.wsee.server.servlet.BaseWSServlet.service(BaseWSServlet.java:92) в javax.servlet.http.HttpServlet.service(HttpServlet.java:856) в weblogic.servlet.in.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) на weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) на веб-сайте servlet.internal. 321) at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121) по адресу weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2010) по адресу weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.erllet.welet.lolet_welet.legletReglet_welet.19) (ServletRequestImpl.java:1366) на weblogic.work.ExecuteThread.execute(ExecuteThread.java:209) на weblogic.work.ExecuteThread.run(ExecuteThread.java:181).
В Google почти каждое решение использует JAX-WS, который не доступен для меня в этой структуре. Благодарю.
1 ответ
Это решение сработало для меня:
Получение объекта HttpServletRequest/Response
Если ваша веб-служба использует HTTP в качестве транспортного протокола, вы можете использовать API weblogic.wsee.connection.transport.servlet.HttpTransportUtils для получения javax.servlet.http.HttpServletRequest и javax.servlet.http.HttpServletResponse объектов из JAX Объект RPC ServletEndpointContext, как показано в следующем примере (соответствующий код выделен жирным шрифтом и объяснен после примера):
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";
}
}