2012-05-02 6 views
10

Ho un'app Tomcat che viene offerta da più domini. Gli sviluppatori precedenti hanno creato un metodo per restituire l'URL dell'applicazione (vedi sotto). Nel metodo richiedono il nome del server (request.getServerName()) che, in modo appropriato, restituisce il ServerName dal file httpd.conf.Tomcat: getHeader ("Host") vs. getServerName()

Tuttavia, non lo voglio. Quello che voglio è il nome host a cui il browser ha inviato la richiesta, cioè qualsiasi dominio dal quale il browser accede all'applicazione.

ho provato getHeader("Host"), ma che è ancora la restituzione del ServerName impostato nel file dihttpd.conf.

Invece di request.getServerName(), cosa devo usare per ottenere il nome del server a cui il browser ha inviato la richiesta?

Ad esempio:

  • ServerName in httpd.conf: www.myserver.net
  • utente accede Tomcat app sul www.yourserver.net

I è necessario restituire www.yourserver.netNONwww.myserver.net. La chiamata request.getServerName() sembra solo per tornare www.myserver.net

/** 
* Convenience method to get the application's URL based on request 
* variables. 
* 
* @param request the current request 
* @return URL to application 
*/ 
public static String getAppURL(HttpServletRequest request) { 
    StringBuffer url = new StringBuffer(); 
    int port = request.getServerPort(); 
    if (port < 0) { 
     port = 80; // Work around java.net.URL bug 
    } 
    String scheme = request.getScheme(); 
    url.append(scheme); 
    url.append("://"); 
    url.append(request.getServerName()); 
    if (("http".equals(scheme) && (port != 80)) || ("https".equals(scheme) && (port != 443))) { 
     url.append(':'); 
     url.append(port); 
    } 
    url.append(request.getContextPath()); 
    return url.toString(); 
} 

Grazie in anticipo!

+1

Tomcat non può nemmeno vedere il file 'httpd.conf', per non parlare di restituire un valore da esso. Tomcat ottiene l'host del server dalla richiesta. – EJP

risposta

15

è necessario assicurarsi che httpd passa la Host intestazione fornita dal client per Tomcat. Il modo più semplice (supponendo che si sta utilizzando mod_proxy_http - non hai detto) è con il seguente:

ProxyPreserveHost On 
+0

Grazie, Mark. Questo ha fatto il trucco. –

3

Che ne dici di utilizzare qualcosa come ho fatto in questa demo JSP?

<% 
    String requestURL = request.getRequestURL().toString(); 
    String servletPath = request.getServletPath(); 
    String appURL = requestURL.substring(0, requestURL.indexOf(servletPath)); 
%> 
appURL is <%=appURL%> 
+0

Rick, questo ha funzionato benissimo, anche se alla fine ho utilizzato il suggerimento di Mark, in quanto non richiedeva il cambio di codice. –

+0

@rickz In che modo un'unità prova qualcosa del genere? Il problema chiave è come creare un'istanza di HttpServletRequest per il test delle unità? La ricerca di Google mostra suggerimenti per prendere in giro la classe, ma se prendi in giro i suoi metodi, in quel momento non stai davvero testando nulla. Ho anche trovato la libreria httpunit, ma anche questo non aiuta. – morpheus

+0

@morpheus Non so come lo testare. – rickz

-1

Questo è davvero molto problematico perché a volte non si sa nemmeno dove l'ospite che ci si aspetta di essere un il dominio completamente qualificato è stato rimosso. @rickz ha fornito un'ottima soluzione, ma qui ce n'è un'altra che considero più completa e copre molti URL diversi:

In pratica, si elimina il protocollo (http: //, https: //, ftp: //, ...) quindi la porta (se esiste) e quindi l'intero URI. Questo ti fornisce l'elenco completo dei domini e sottodomini di primo livello.

String requestURL = request.getRequestURL().toString(); 
String withoutProtocol = requestURL.replaceAll("(.*\\/{2})", "") 
String withoutPort = withoutProtocol.replaceAll("(:\\d*)", "") 
String domain = withoutPort.replaceAll("(\\/.*)", "") 

Ho fatto questo in scala utilizzando le definizioni in linea di metodo, ma il codice sopra è più prolisso perché ho trovato meglio per pubblicare la soluzione in puro Java.Quindi, se si crea metodi per questo si potrebbe incatenare loro di fare qualcosa di simile:

removeURI(removePort(removeProtocol(requestURL))) 
1

Forse non legati a questa domanda. Se si utilizza Tomcat, è possibile specificare qualsiasi stringa host nell'intestazione della richiesta, anche javascript come <script>alert(document.cookie);</script>

allora potrebbe essere mostrato nella pagina .:

<p> host name is : <%= request.getServerName() %> </p> 

Quindi è necessario verificare prima di usarlo.