2011-02-03 19 views
12

Wiem, że to może wydawać się głupie pytanie, ale nie jestem w stanie znaleźć żadnych informacji dotyczących tego pytania. Mam usługę WWW java (generowane przy użyciu NetBeans) i wewnątrz klasy usługi sieci Web Chciałbym znać adres URL, w którym usługa sieci Web została wdrożona. Na przykład, jeśli wdrażam usługę WWW na moim lokalnym serwerze GlassFish, usługa internetowa jest dostępna pod adresem "http: // localhost: 8080/MyService /", gdzie "MyService" to nazwa mojej usługi. Powodem, dla którego muszę znać ten URL, jest fakt, że moja usługa internetowa generuje pliki, które muszę udostępnić pod tym adresem URL. Na przykład wywołanie usługi WWW zwraca adres URL "http: // localhost: 8080/MyService/report.html" Znalazłem kilka linków dotyczących "WebServiceContext", ale nie mogę uzyskać adresu URL, pod którym moja usługa sieciowa jest bieganie.Jak znaleźć adres URL mojej usługi internetowej?

Zmieniano

Dla wyjaśnienia: Klasa Wewnątrz MyWebService.java Chcę dowiedzieć się, URL, w którym mój serwis internetowy został wdrożony (w tym przypadku, mój serwis internetowy działa na „http: // localhost: 8080/MyService/", ale gdy zostanie wdrożony na serwerze produkcyjnym, ten adres URL ulegnie zmianie)

Odpowiedz

4

Jeśli proszą się, jak znaleźć nazwę hosta (na przykład „localhost” lub „www.example.com”), że kontener serwletów jest słuchanie masz kilka opcji:

  • Dodaj punkt konfiguracji który jest ustawiony w momencie wdrażania (np plik konfiguracyjny, właściwości systemu)
  • Look Into jeśli kontener serwletów naraża żadnej konfiguracji „wirtualnego hosta” poprzez JMX lub czytać jego pliki konfiguracyjne (np tomcat hosts)
  • Znajdź adres IP serwer i wykonaj wyszukiwanie DNS, aby uzyskać skonfigurowaną nazwę hosta
  • Sprawdź nagłówek 'host' z HttpServletRequest przychodzącego

    String hostname = request.getRequestHeader("Host");

+0

Mam go skonfigurowany do odczytu adresu URL z pliku konfiguracyjnego. Próbuję usunąć to ustawienie konfiguracji, ponieważ uważam, że powinno być łatwe znalezienie adresu URL hosta. – Johnny

+0

Jeśli naprawdę chcesz zerowej konfiguracji po stronie serwera, musisz użyć nagłówka "Host", który jest w żądaniu HTTP. –

+0

Uriah, nie mogłem uzyskać tego adresu URL z nagłówka "Host". Jeśli możesz pokazać kod, daj mi znać. dzięki. – Johnny

2

Mam nadzieję, że jestem w stanie ci pomóc. Niedawno rozpocząłem pracę z usługami sieciowymi (Jersey REST) ​​i odkryłem, że URL do punktu końcowego to: "http: // localhost: 8080/MyService/XXX/YYY"
gdzie XXX = wzorzec adresu URL w mapowaniu serwletu w pliku web.xml (np. niski)

<servlet-mapping> 
<servlet-name>Jersey REST Service</servlet-name> 
<url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

a YYY to ścieżka zdefiniowane przez użytkownika @Path Zestawienie parametrów() więc w przypadku tego przykładu byłoby coś jak:

„http: // localhost: 8080/MyService/rest/myPathDefinition '

Inną rzeczą, na którą warto zwrócić uwagę, jest fakt, że w rzeczywistości można zmienić kontekstowy katalog główny w środowisku Eclipse, ale domyślnie będzie to nazwa projektu Java. Proszę dać mi znać, jeśli potrzebujesz dalszych wyjaśnień lub jeśli to nie pomogło/ktoś może rozwinąć to.

+0

Nie sądzę, bym się wystarczająco jasno przedstawił, więc postaram się przeformułować pytanie. Znam adres URL mojej usługi WWW, ponieważ ją wdrażam. Pytanie brzmi, w jaki sposób programowo uzyskać ten adres URL. Więc w klasie MyWebservice.java chcę znać adres URL, w którym moja usługa internetowa została wdrożona (w tym przypadku jest to "http: // localhost: 8080/MyService", ale zmieni się to po wdrożeniu usługi internetowej serwer produkcyjny). – Johnny

8

Łatwiej moim zdaniem, na przykład:

@GET 
public URI redirectSendMail(@Context UriInfo ui) { 
    return ui.getBaseUri(); 
} 

Jeśli chcemy wysłać ciąg z powrotem do klient, wskazując dokładną ścieżkę jakiegoś zasobu, możemy chcieć czegoś takiego.

@GET 
public String getResourcePath(@Context UriInfo ui) { 
    return ui.getAbsolutePath(); 
} 
1

Dodaj poniższą właściwość w klasie webservice.

@Resource  
private WebServiceContext wsCtxt; 

Teraz poniżej fragment kodu daje wartości ty szukasz:

MessageContext msgCtxt = wsCtxt.getMessageContext(); 
    HttpServletRequest request = 
     (HttpServletRequest)msgCtxt.get(MessageContext.SERVLET_REQUEST); 

    String hostName = request .getServerName(); 
    int port = request .getServerPort(); 

aby sprawdzić, z której usługa została wywołana, użyj poniższego kodu.

String clientIP = request .getRemoteAddr(); 

Powiązane import są poniżej:

import javax.annotation.Resource; 

import javax.servlet.http.HttpServletRequest; 

import javax.xml.ws.WebServiceContext; 
import javax.xml.ws.handler.MessageContext; 

import weblogic.jws.Context; 

import weblogic.wsee.jws.JwsContext; 
+0

Wygląda na to, że @Resource zwróci wartość null pewne okoliczności ... Zobacz tutaj: https://stackoverflow.com/questions/15346630/jax-ws-webservicecontext-remains-null-annotation-injection-fails – JGFMK

Powiązane problemy