2010-01-26 8 views
5

maven에서 wsgen에 의해 생성 된 웹 서비스가 있습니다. Glassfish에 서비스를 배포하면 서버 URL이 WSDL에 저장됩니다. Google Glassfish 서버는 Apache 프록시 서버 옆에 있습니다. 누군가가 우리의 WSDL에 액세스하여 서비스 엔드 포인트를 살펴보고 그들이 볼 수있는 비누 주소 위치가Glassfish 생성 WSDL 서비스 끝점 주소 무시

http://app server url/service... 

대신

http://proxy server url/service... 

은 무엇이 모든 수단 것은 내가 약간의 설명이 필요 추측입니다 몇 가지 항목에 ...

  1. 이 끝점 주소는 중요합니까? 끝점 주소가 서비스를 호출하기 위해 호출 할 프록시 서버의 URL과 일치하지 않으면 클라이언트가 계속 작동 할 수 있습니까? 이것은 기본적으로 "은 인터페이스가 객체 인 웹 서비스에 대한 WSDL입니다."라는 질문을합니다.

    UPDATE :은 "인터페이스로 웹 서비스에 WSDL은을 반대하는"것처럼 않습니다이 첫 번째 질문에 대한 응답. WSDL에 지정된 엔드 포인트 주소는 중요하지 않습니다. 사실, WSDL as described here에 지정된 것과 다른 엔드 포인트에서 웹 서비스 조작을 호출하는 것은 상대적으로 쉽지 않습니다. 우리는 글래스 피시에 배포 할 때

     
    // Override the endpoint address 
    ((BindingProvider)proxy).getRequestContext().put(
         BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
         " http://new/endpointaddress "); 
    proxy.sayHello("Hello World!"); 
    

  2. WSDL에

     
    // Create service and proxy from the generated Service class. 
    HelloService service = new HelloService(); 
    HelloPort proxy = service.getHelloPort(); 
    
    이 자동으로 생성됩니다. 앱 서버 설정을 통해 Glassfish에서이 생성 된 끝점 주소를 재정의하는 쉬운 방법이 있습니까? 그렇다면 자동으로 프록시 서버 URL을 생성 된 WSDL에 배치하는 설정을 만들 수 있습니다.

1이 실제로 중요하며 2로 어떤 식 으로든 무시할 수 없다면 기본적으로 개발 및 생산을 위해 별도의 빌드를 수행해야합니다. 우리가 다른 서버에 배포하기 위해해야하는 유일한 일은 기존 환경 (테스트 한)을 한 환경에서 새 서버로 옮기는 것입니다.

답변

4

서비스가 배포 된 HTTP Listener에는 Server Name 매개 변수가 있습니다. Glassfish 관리 콘솔에서이 값을 지정할 수 있으며 Glassfish는 요청 URL의 호스트 이름 대신이 이름을 사용합니다.

아쉽게도이 매개 변수는 앱 서버와 프록시 서버가 동일한 포트 또는 프로토콜을 사용하지 않는 경우 포트 또는 프로토콜 (http : // https)을 무시할 수 없습니다.

내가 대신 한 것은 write a simple servlet filter이며이를 처리하는 서비스가 있습니다.

3

나는이 문제를 다루는 아주 간단한 방법이라고 생각하는 것을 발견했다 : 아파치에서 mod_substitute를 사용하라. 이 문제가있는 우리는 이미 Apache를 사용하고 있으며 내장되어 있으며 간단합니다.이 방법이 가장 좋았습니다.

내 아파치 conf의 파일 중 하나에서 다음과 유사한 블록을 넣어 기쁨을 발견

:

<Location /> 
    AddOutputFilterByType SUBSTITUTE text/xml 
    Substitute "s|http://internal:8080/xxx|https://external/xxx|ni" 
</Location> 
관련 문제