代码之家  ›  专栏  ›  技术社区  ›  flybywire

完成URL的httpservletrequest

  •  210
  • flybywire  · 技术社区  · 15 年前

    我有一个 HttpServletRequest 对象。

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

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

    10 回复  |  直到 6 年前
        1
  •  331
  •   Chetan Gole    7 年前

    这个 HttpServletRequest 有以下方法:

    因此,要获取完整的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();
        }
    }
    
        2
  •  122
  •   Igor Mukhin    10 年前

    我使用这种方法:

    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();
    }
    
        3
  •  26
  •   Teja Kantamneni    15 年前
    // 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;
    }
    
        4
  •  6
  •   Vinko Vrsalovic    15 年前

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

    StringBuffer url = req.getRequestURL();
    String queryString = req.getQueryString();
    if (queryString != null) {
        url.append('?');
        url.append(queryString);
    }
    String requestURL = url.toString();
    
        5
  •  5
  •   Michael Borgwardt    15 年前

    结合的结果 getRequestURL() getQueryString() 会得到你想要的结果。

        6
  •  5
  •   Peter Szanto    9 年前

    在Spring项目中,您可以使用

    UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build().toUriString()
    
        7
  •  1
  •   abishkar bhattarai    12 年前

    你可以使用过滤器。

    @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> 在web.xml中的过滤器映射中

        8
  •  1
  •   Kishor Prakash    12 年前

    对httpservletrequest对象使用以下方法

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

    java.lang.StringBuffer getRequestURL() -重新构造客户端用于发出请求的URL。

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

        9
  •  0
  •   ziesemer    8 年前

    参加聚会有点晚,但我把这个包括在我的 MarkUtils-Web library 在里面 WebUtils -已批准的支票样式和JUnit测试:

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

    可能是迄今为止在Mat Banik之后最快和最可靠的答案,但即使是他的也不能解释HTTP/HTTPS潜在的非标准端口配置。

    另请参见:

        10
  •  0
  •   Johannes Stadler Mr Br    6 年前

    您可以使用三元编写一个简单的一行程序,如果您使用 .getRequestURL() :

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

    但这只是句法上的糖分。

    推荐文章