본문 바로가기

IT for developer/Webservice

Websphere 5.12에서 웹서비스 클라이언트 IP 알아내기.

요즘 프로젝트를 웹스피어 5.12에서 웹서비스를 구축하고 있는데 최근 WAS에서 지원하고 있는 클라이언트 IP를 얻어 오는 방법이 5.12에서는 지원하지 않아 webservice 라이브러리를 디컴파일하여 수정해봄.

1. 웹서비스 라이브러리 수정

webservices.jar 파일에 다음 클래스를 디컴파일 한다. jad 디컴파일러 강추

com/ibm/ws/webservices/engine/transport/http/WebServiceServlet.class

doPost()함수에 클라이언트 IP를 MessageContext에 Property로 저장한다.

디컴파일 했을때 435~445 라인 정도 위치 정도임

 public void doPost(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
        throws ServletException, IOException {

...
                String s = getSoapAction(httpservletrequest);
                if(s != null)
                {
                    messagecontext.setUseSOAPAction(true);
                    messagecontext.setSOAPActionURI(s);
                }
                messagecontext.setSession(new WebServicesHttpSession(httpservletrequest));
                //RemoteAddress 등록하기 위하여 다음 라인을 추가하면 된다.
                messagecontext.setProperty("remoteaddr", httpservletrequest.getRemoteAddr());

....

2. 웹서비스 구현할때 추가할 부분

   MessageContext msgCtx = (MessageContext) ctx.getMessageContext();
   String clientIp = (String) msgCtx.getProperty("remoteaddr");

물론 위에 구문을 그대로 사용하려면 ctx가 정의 되어 있어야한다.

보통 SOAP 헤더를 다루기 위하여 다음과 같이 구현클래스에서 javax.xml.rpc.server.ServiceLifecycle을 사용한다.


1) public class 웹서비스구현클래스    implements 웹서비스인터페이스, ServiceLifecycle

 

2) init 메소드를 구현한다.

    public void init(Object arg0)
        throws ServiceException
    {
        if(javax.xml.rpc.server.ServletEndpointContext.class.isInstance(arg0)) {
        ctx = (ServletEndpointContext)arg0;
       }

    }

3) 멤버 속성으로 ServletEndpointContext ctx; 선언해 두면 된다.

대략 종합하면 다음과 같은 소스형태가 됨.

import javax.xml.rpc.ServiceException;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.rpc.server.ServiceLifecycle;
import javax.xml.rpc.server.ServletEndpointContext;

public class Hello implements HelloIF, ServiceLifecycle {

ServletEndpointContext ctx;
    public void init(Object arg0)
        throws ServiceException
    {
        if(javax.xml.rpc.server.ServletEndpointContext.class.isInstance(arg0)) {
         ctx = (ServletEndpointContext)arg0;
     }
 
    }

   public String hello(String name) {

       MessageContext msgCtx = (MessageContext) ctx.getMessageContext();
       String clientIp = (String) msgCtx.getProperty("REMOTE_ADDR");

       return "Hello"+clientIp;

   }

 public void destroy() {}
}


----------------------------------

참고로 웹스피어 6.1에서 소스 디컴파일해본 결과   6.1은 클라이언트 IP를 얻어오기 위하여 라이브러리 소스를 수정할 필요가 없다. 단지 웹서비스 구현할때 해야 하는 부분만 해주만 된다.

6.1과 5.1과 동일한 구현 클래스로 수행되게 하기위해서는

Property 속성 이름을 REMOTE_ADDR 대신 remoteaddr로 해야한다.

6.1에는 유사한 방법으로 com.ibm.ws.webservices.engine.transport.http.WebServicesServlet에 remoteaddr 이라는 Property를 지정해 두었다.

예전 네이버 블러그 자료 -