HttpServletRequest完成URL

问题描述 投票:237回答:10

我有一个HttpServletRequest对象。

我如何获得导致此调用到达我的servlet的完整而准确的URL?

或者至少尽可能准确,因为可能可以重新生成某些东西(可能是参数的顺序)。

java http servlets
10个回答
377
投票

HttpServletRequest具有以下方法:

  • HttpServletRequest-返回完整URL的查询字符串分隔符getRequestURL()]之前的部分>
  • getRequestURL()-返回查询字符串分隔符?]后的完整URL的一部分>
  • 因此,要获取完整的URL,只需执行:

getQueryString()

我使用这种方法:

getQueryString()
?

在Spring项目中,您可以使用

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();
    }
}

不推荐使用HttpUtil,这是正确的方法

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; } UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build().toUriString() 的结果结合起来应该可以得到所需的结果。

您可以使用过滤器。

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

不要忘记将getRequestURL()放在web.xml的过滤器映射中

在HttpServletRequest对象上使用以下方法

java.lang.StringgetRequestURL()-从HTTP协议的第一行返回从协议名称到查询字符串的部分请求URL。

java.lang.StringBuffergetQueryString()-重建客户端用于发出请求的URL。

java.lang.StringgetQueryString()-返回路径后面的请求URL中包含的查询字符串。

聚会有点晚了,但是我在@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); } <dispatcher>FORWARD</dispatcher>中加入了此内容-经过Checkstyle批准和JUnit测试:

getRequestURI()

这可能是迄今为止Mat Banik的最快和最可靠的答案-但即使他也没有考虑到使用HTTP / HTTPS的潜在非标准端口配置。

另请参见:

您可以编写一个简单的带有三元数的衬线,并且如果您使用MarkUtils-Web library中的StringBuffer的生成器模式:

WebUtils

但这只是语法糖。


0
投票

您可以编写一个简单的带有三元数的衬线,并且如果您使用MarkUtils-Web library中的StringBuffer的生成器模式:


0
投票
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;
    }
}

141
投票

我使用这种方法:


27
投票
?

7
投票

在Spring项目中,您可以使用


6
投票

不推荐使用HttpUtil,这是正确的方法


5
投票

// 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; } UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build().toUriString() 的结果结合起来应该可以得到所需的结果。


1
投票

您可以使用过滤器。


1
投票

在HttpServletRequest对象上使用以下方法


0
投票

聚会有点晚了,但是我在@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); } <dispatcher>FORWARD</dispatcher>中加入了此内容-经过Checkstyle批准和JUnit测试:

© www.soinside.com 2019 - 2024. All rights reserved.