it-swarm.com.de

HttpServletRequest zur Vervollständigung der URL

Ich habe ein HttpServletRequest-Objekt.

Wie erhalte ich die vollständige und genaue URL, durch die dieser Aufruf bei meinem Servlet ankommt?

Oder zumindest so genau wie möglich, da es vielleicht Dinge gibt, die regeneriert werden können (die Reihenfolge der Parameter vielleicht).

210
flybywire

Die HttpServletRequest hat folgende Methoden:

  • getRequestURL() - gibt den Teil der vollständigen URL vor dem Trennzeichen der Abfragezeichenfolge ? zurück.
  • getQueryString() - gibt den Teil der vollständigen URL nach dem Trennzeichen der Abfragezeichenfolge ? zurück.

So erhalten Sie die vollständige URL:

public static String getFullURL(HttpServletRequest request) {
    StringBuilder requestURL = new StringBuilder(request.getRequestURL().toString());
    String queryString = request.getQueryString();

    if (queryString == null) {
        return requestURL.toString();
    } else {
        return requestURL.append('?').append(queryString).toString();
    }
}
331
Bozho

Ich verwende diese Methode:

public static String getURL(HttpServletRequest req) {

    String scheme = req.getScheme();             // http
    String serverName = req.getServerName();     // hostname.com
    int serverPort = req.getServerPort();        // 80
    String contextPath = req.getContextPath();   // /mywebapp
    String servletPath = req.getServletPath();   // /servlet/MyServlet
    String pathInfo = req.getPathInfo();         // /a/b;c=123
    String queryString = req.getQueryString();          // d=789

    // Reconstruct original requesting URL
    StringBuilder url = new StringBuilder();
    url.append(scheme).append("://").append(serverName);

    if (serverPort != 80 && serverPort != 443) {
        url.append(":").append(serverPort);
    }

    url.append(contextPath).append(servletPath);

    if (pathInfo != null) {
        url.append(pathInfo);
    }
    if (queryString != null) {
        url.append("?").append(queryString);
    }
    return url.toString();
}
122
Mat B.
// http://hostname.com/mywebapp/servlet/MyServlet/a/b;c=123?d=789

public static String getUrl(HttpServletRequest req) {
    String reqUrl = req.getRequestURL().toString();
    String queryString = req.getQueryString();   // d=789
    if (queryString != null) {
        reqUrl += "?"+queryString;
    }
    return reqUrl;
}
26
Teja Kantamneni

HttpUtil ist dies die richtige Methode, wenn sie veraltet ist

StringBuffer url = req.getRequestURL();
String queryString = req.getQueryString();
if (queryString != null) {
    url.append('?');
    url.append(queryString);
}
String requestURL = url.toString();
6
Vinko Vrsalovic

In einem Spring-Projekt können Sie verwenden 

UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build().toUriString()
5
Peter Szanto

Wenn Sie die Ergebnisse von getRequestURL() und getQueryString() kombinieren, erhalten Sie das gewünschte Ergebnis.

5

Verwenden Sie die folgenden Methoden für das HttpServletRequest-Objekt

Java.lang.String getRequestURI () - Gibt den Teil der URL dieser Anforderung vom Protokollnamen bis zur Abfragezeichenfolge in der ersten Zeile der HTTP-Anforderung zurück.

Java.lang.StringBuffer getRequestURL () - Rekonstruiert die URL, die der Client für die Anforderung verwendet hat.

Java.lang.String getQueryString () - Gibt die Abfragezeichenfolge zurück, die in der Anforderungs-URL nach dem Pfad enthalten ist.

1
Kishor Prakash

Sie können Filter verwenden.

@Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
            HttpServletRequest test1=    (HttpServletRequest) arg0;

         test1.getRequestURL()); it gives  http://localhost:8081/applicationName/menu/index.action
         test1.getRequestURI()); it gives applicationName/menu/index.action
         String pathname = test1.getServletPath()); it gives //menu/index.action


        if(pathname.equals("//menu/index.action")){ 
            arg2.doFilter(arg0, arg1); // call to urs servlet or frameowrk managed controller method


            // in resposne 
           HttpServletResponse httpResp = (HttpServletResponse) arg1;
           RequestDispatcher rd = arg0.getRequestDispatcher("another.jsp");     
           rd.forward(arg0, arg1);





    }

vergessen Sie nicht, <dispatcher>FORWARD</dispatcher> in die Filterzuordnung in web.xml aufzunehmen

1

Etwas spät zur Party, aber ich habe dies in meine MarkUtils-Web-Bibliothek aufgenommen in WebUtils - Checkstyle-geprüft und JUnit-getestet:

import javax.servlet.http.HttpServletRequest;

public class GetRequestUrl{
    /**
     * <p>A faster replacement for {@link HttpServletRequest#getRequestURL()}
     *  (returns a {@link String} instead of a {@link StringBuffer} - and internally uses a {@link StringBuilder})
     *  that also includes the {@linkplain HttpServletRequest#getQueryString() query string}.</p>
     * <p><a href="https://Gist.github.com/ziesemer/700376d8da8c60585438"
     *  >https://Gist.github.com/ziesemer/700376d8da8c60585438</a></p>
     * @author Mark A. Ziesemer
     *  <a href="http://www.ziesemer.com.">&lt;www.ziesemer.com&gt;</a>
     */
    public String getRequestUrl(final HttpServletRequest req){
        final String scheme = req.getScheme();
        final int port = req.getServerPort();
        final StringBuilder url = new StringBuilder(256);
        url.append(scheme);
        url.append("://");
        url.append(req.getServerName());
        if(!(("http".equals(scheme) && (port == 0 || port == 80))
                || ("https".equals(scheme) && port == 443))){
            url.append(':');
            url.append(port);
        }
        url.append(req.getRequestURI());
        final String qs = req.getQueryString();
        if(qs != null){
            url.append('?');
            url.append(qs);
        }
        final String result = url.toString();
        return result;
    }
}

Vermutlich die bisher schnellste und robusteste Antwort hinter Mat Banik - aber nicht alle möglichen Nicht-Standard-Port-Konfigurationen mit HTTP/HTTPS werden berücksichtigt.

Siehe auch:

0
ziesemer

Sie können einen einfachen Einzeiler mit einem Ternär schreiben und wenn Sie das Builder-Muster des StringBuffer von .getRequestURL() verwenden:

private String getUrlWithQueryParms(final HttpServletRequest request) { 
    return request.getQueryString() == null ? request.getRequestURL().toString() :
        request.getRequestURL().append("?").append(request.getQueryString()).toString();
}

Das ist aber nur syntaktischer Zucker.

0