web-dev-qa-db-fra.com

Java HttpServletRequest obtenir l'URL dans la barre d'URL des navigateurs

J'essaie donc de saisir l'URL actuelle de la page à l'aide de l'objet de demande Java. J'ai utilisé request.getRequestURI () pour préformer ceci, mais j'ai remarqué que lorsqu'une classe Java me redirige vers une autre page d'une requête de servlet, getRequestURI donne cette adresse par opposition à la URL d'origine qui a été saisie dans le navigateur et qui s'affiche toujours dans le navigateur.

Ex:\AdvancedSearch:
getRequestURI() renvoie "\ subdir\search\search.jsp"

Je cherche un moyen de saisir ce que le navigateur considère comme l'URL et non ce que cette page sait n'est qu'un wrapper de servlet.

24
Ballsacian1

Si votre demande actuelle provient d'un transfert "à l'intérieur du serveur d'applications" ou d'inclusion, le serveur d'applications doit conserver les informations de demande en tant qu'attributs de demande. Les attributs spécifiques et ce qu'ils contiennent varient selon que vous effectuez un transfert ou une inclusion.

Pour <jsp:include>, L'URL parent d'origine sera renvoyée par request.getRequestURL(), et des informations sur la page incluse seront trouvées dans les attributs de requête suivants:

     javax.servlet.include.request_uri
     javax.servlet.include.context_path
     javax.servlet.include.servlet_path
     javax.servlet.include.path_info
     javax.servlet.include.query_string

Pour <jsp:forward>, La nouvelle URL sera renvoyée par request.getRequestURL(), et les informations de la demande d'origine seront trouvées dans les attributs de demande suivants:

     javax.servlet.forward.request_uri
     javax.servlet.forward.context_path
     javax.servlet.forward.servlet_path
     javax.servlet.forward.path_info
     javax.servlet.forward.query_string

Celles-ci sont décrites dans les sections 8.3 et 8.4 de la spécification Servlet 2.4.

Cependant, sachez que ces informations ne sont conservées que pour les demandes envoyées en interne. Si vous disposez d'un serveur Web frontal ou si vous effectuez une répartition en dehors du conteneur actuel, ces valeurs seront nulles. En d'autres termes, il se peut que vous n'ayez aucun moyen de trouver l'URL de demande d'origine.

41
kdgregory

Je viens de faire un peu de rangement de la solution par Ballsacian1

String currentURL = null;
if( request.getAttribute("javax.servlet.forward.request_uri") != null ){
    currentURL = (String)request.getAttribute("javax.servlet.forward.request_uri");
}
if( currentURL != null && request.getAttribute("javax.servlet.include.query_string") != null ){
    currentURL += "?" + request.getQueryString();
}

Les vérifications nulles vont s'exécuter beaucoup plus efficacement que les comparaisons de chaînes.

8
readikus
String activePage = "";
    // using getAttribute allows us to get the orginal url out of the page when a forward has taken place.
    String queryString = "?"+request.getAttribute("javax.servlet.forward.query_string");
    String requestURI = ""+request.getAttribute("javax.servlet.forward.request_uri");
    if(requestURI == "null") {
        // using getAttribute allows us to get the orginal url out of the page when a include has taken place.
        queryString = "?"+request.getAttribute("javax.servlet.include.query_string");
        requestURI = ""+request.getAttribute("javax.servlet.include.request_uri");
    }
    if(requestURI == "null") {
        queryString = "?"+request.getQueryString();
        requestURI = request.getRequestURI();
    }
    if(queryString.equals("?null")) queryString = "";
    activePage = requestURI+queryString;
5
Ballsacian1

$ {requestScope ['javax.servlet.forward.query_string']} - si vous y accédez depuis jsp, en utilisant le langage d'expression

4
MihaiS

Pour obtenir le chemin demandé HTTP sans connaître l'état du flux interne de la demande, utilisez cette méthode:

public String getUri(HttpServletRequest request) {
    String r = (String) request.getAttribute("javax.servlet.forward.request_uri");
    return r == null ? request.getRequestURI() : r;
}
1
Daniel De León

Pouvez-vous essayer ceci

<%=request.getRequestURL().toString()%>
1
iCrazybest

Même réponse que @kdgregory, mais vous pouvez plutôt utiliser les constantes Request Dispatcher.

javax.servlet.include.request_uri        RequestDispatcher.FORWARD_REQUEST_URI
javax.servlet.include.context_path       RequestDispatcher.FORWARD_CONTEXT_PATH
javax.servlet.include.servlet_path       RequestDispatcher.FORWARD_SERVLET_PATH
javax.servlet.include.path_info          RequestDispatcher.FORWARD_PATH_INFO
javax.servlet.include.query_string       RequestDispatcher.FORWARD_QUERY_STRING
0
winter