Java 有没有一种方法可以在过滤器中获取带有参数的原始请求URL,而无需重新生成

Java 有没有一种方法可以在过滤器中获取带有参数的原始请求URL,而无需重新生成,java,servlets,servlet-filters,Java,Servlets,Servlet Filters,我在JavaEE项目中有一个servlet过滤器,需要获取原始请求url和url参数。我目前正在使用以下代码重建原始URL,但感觉完全错误: StringBuilder urlBuilder = new StringBuilder(req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+req.getContextPath()); if(req.getParameterMap() != null && r

我在JavaEE项目中有一个servlet过滤器,需要获取原始请求url和url参数。我目前正在使用以下代码重建原始URL,但感觉完全错误:

StringBuilder urlBuilder = new StringBuilder(req.getScheme()+"://"+req.getServerName()+":"+req.getServerPort()+req.getContextPath());
if(req.getParameterMap() != null && req.getParameterMap().size() > 0) urlBuilder.append("?"+getParameterString(req.getParameterMap()));

private StringBuilder getParameterString(Map<String, String[]> params){
    StringBuilder sb = new StringBuilder("");
    for(String key : params.keySet()){
        for(String param : params.get(key)){
            sb.append(String.format("%s=%s&", key, param));
        }
    }
    return sb;
}

这看起来更好,因为我正在有效地撤消servlet容器在中解析参数所做的工作,而我真正想要做的就是接收未解析的原始URL。

如果您的请求对象是的实例,您可以这样做

if (req instanceof HttpServletRequest) {
    HttpServletRequest httpReq = (HttpServletRequest) req;
    StringBuffer url = httpReq.getRequestURL();
    if (httpReq.getQueryString() != null) {
        url.append("?");
        url.append(httpReq.getQueryString());
    }
    String urlString = url.toString();
}

如果
getQueryString()
返回
null
,则结果不正确。另外,的javadoc说:由于此方法返回的是
StringBuffer
,而不是字符串,因此您可以轻松地修改URL,例如,添加查询参数。那么为什么不这样做呢?谢谢@Andreas,我已经更新了我的答案,对
getQueryString()
进行了空检查,并使用
StringBuffer
填充URL的其余部分。不,你没有。这段代码甚至不编译
getRequestURL()
不会返回
字符串,正如@Andreas已经指出的,即使它返回了
append()
调用,也不会对调用它们的字符串执行任何操作。我的坏@EJP。。。我确信我将
stringurl
更改为
stringbufferurl
,但我应该仔细检查一下。谢谢你指出。最初的答案足够好,可以大致了解在API中查找的位置,但是谢谢你为那些谷歌用户更新它。
if (req instanceof HttpServletRequest) {
    HttpServletRequest httpReq = (HttpServletRequest) req;
    StringBuffer url = httpReq.getRequestURL();
    if (httpReq.getQueryString() != null) {
        url.append("?");
        url.append(httpReq.getQueryString());
    }
    String urlString = url.toString();
}