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).
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();
}
}
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();
}
// 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;
}
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();
In einem Spring-Projekt können Sie verwenden
UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build().toUriString()
Wenn Sie die Ergebnisse von getRequestURL()
und getQueryString()
kombinieren, erhalten Sie das gewünschte Ergebnis.
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.
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
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."><www.ziesemer.com></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:
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.