Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpServletRequest以完成URL_Java_Http_Servlets - Fatal编程技术网

Java HttpServletRequest以完成URL

Java HttpServletRequest以完成URL,java,http,servlets,Java,Http,Servlets,我有一个HttpServletRequest对象 如何获取导致此调用到达我的servlet的完整而准确的URL 或者至少尽可能准确,因为可能存在可以重新生成的内容(可能是参数的顺序)。具有以下方法: -返回查询字符串分隔符字符之前的完整URL部分? -返回查询字符串分隔符字符后的完整URL部分? 因此,要获得完整的URL,只需执行以下操作: public static String getFullURL(HttpServletRequest request) { StringBuil

我有一个
HttpServletRequest
对象

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

或者至少尽可能准确,因为可能存在可以重新生成的内容(可能是参数的顺序)。

具有以下方法:

  • -返回查询字符串分隔符字符之前的完整URL部分
  • -返回查询字符串分隔符字符后的完整URL部分
因此,要获得完整的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();
    }
}

将和的结果组合在一起应该会得到所需的结果。

HttpUtil被弃用,这是正确的方法

StringBuffer url = req.getRequestURL();
String queryString = req.getQueryString();
if (queryString != null) {
    url.append('?');
    url.append(queryString);
}
String requestURL = url.toString();
我使用这种方法:

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();
}
您可以使用过滤器

@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);





    }

不要忘记在web.xml中的过滤器映射中提出
前进
,在HttpServletRequest对象上使用以下方法

java.lang.String -返回此请求URL的一部分,从协议名称到HTTP请求第一行中的查询字符串

java.lang.StringBuffer -重建客户端用于发出请求的URL

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

在Spring项目中,您可以使用

UriComponentsBuilder.fromHttpRequest(new ServletServerHttpRequest(request)).build().toUriString()

参加派对有点晚,但我在我的InCheckStyle approved和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;
    }
}
import javax.servlet.http.HttpServletRequest;
公共类GetRequestUrl{
/**
*更快地替换{@link HttpServletRequest#getRequestURL()}
*(返回一个{@link String}而不是一个{@link StringBuffer}-并在内部使用一个{@link StringBuilder})
*这还包括{@linkplain HttpServletRequest#getQueryString()查询字符串}

*

*@作者马克·齐塞默 * */ 公共字符串getRequestUrl(最终HttpServletRequest请求){ 最终字符串scheme=req.getScheme(); final int port=req.getServerPort(); 最终StringBuilder url=新StringBuilder(256); 追加(方案); url.append(“:/”); append(req.getServerName()); if(!(((“http.equals(scheme)”和&(port==0 | | port==80)) ||(“https.equals(scheme)&&port==443))){ append(“:”); url.append(端口); } append(req.getRequestURI()); 最后一个字符串qs=req.getQueryString(); 如果(qs!=null){ url.append(“?”); url.append(qs); } 最终字符串结果=url.toString(); 返回结果; } }
这可能是迄今为止最快、最可靠的答案,远远落后于Mat Banik的答案,但即使是他的答案,也没有考虑到HTTP/HTTPS的潜在非标准端口配置

另见:


如果使用
中StringBuffer的生成器模式,您可以编写一个简单的带三元数的一行程序。getRequestURL()



但这只是语法上的甜点。

您忽略了
StringBuffer
的优点。是的。我接受它,但我猜它只是另外两个对象。它是一个额外的对象(StringBuilder),并且不会改变返回的底层StringBuffer。事实上,我更喜欢这个答案而不是“接受”答案,JVM将优化差异,而这不会有任何引入错误的风险。(request.getRequestURL().toString()+((request.getQueryString()!=null)?(“?”+request.getQueryString()):“”)您从getRequestURI复制了描述(错误)但是在代码中使用getRequestURL(右)。您需要有条件地检查查询字符串是否为空。您还需要修改支持请求URL的StringBuffer。如果请求实现没有生成防御副本,那么这是一种很好的方法,可以在代码的其他部分引入奇怪的行为和bug,而这些部分期望它以原始形式出现StringBuffer@KenBlair:有目的地返回StringBuffer,以便您可以轻松添加更多存储。由于这是在javadoc上指定的,因此实现中期望调用方不会修改返回的StringBuffer是非常荒谬的——因此,这很酷。这是一个有助于快速参考HttpServletRequest上所有可用信息位的答案。但是,我认为在决定是否向结果中添加端口时,您应该检查该方案。例如,“https”应该是443。一个小优化是使用StringBuilder而不是StringBuffer,只是一个提示只是一个注释:在这个特定示例中,线程安全不是问题,因为
url
被声明、实例化,并且只在方法内部使用,因此,除了调用该方法的线程外,不能从其他线程访问它。如前所述,这里的线程安全不是问题,因为您正在为每个调用创建
StringBuffer
的实例,并且不与任何其他线程共享它。这应该更改为
StringBuilder
。有没有理由不使用
getRequestURI
?如何处理与post相关的参数?@flash严格来说,post参数不是URL的一部分,它们是请求的主体。另请参阅:为什么我们没有为记录使用UTI函数…test1.getRequestURI();它给出了/applicationName/menu/index.action(即它包含前导斜杠)为什么不呢
newservletserverhttprequest(request).getURI()
URI这不是最佳答案。这是我今天看到的最令人满意的答案。即使微服务链接在网关后面也能工作!必须补充的是,UriComponentsBuilder没有添加“UriComponentsBuilder”,所以它在gateway下不能完美工作。但复制这种方法仍然很好。
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;
    }
}
private String getUrlWithQueryParms(final HttpServletRequest request) { 
    return request.getQueryString() == null ? request.getRequestURL().toString() :
        request.getRequestURL().append("?").append(request.getQueryString()).toString();
}