【问题标题】:Is there a way to get the original request URL with params in a Filter without Rebuilding有没有办法在不重建的情况下在过滤器中获取带有参数的原始请求 URL
【发布时间】:2017-06-04 22:45:07
【问题描述】:

我在 Java EE 项目中有一个 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;
}

我真正想做的是更像以下的事情:

req.getUrlWithParams()

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

【问题讨论】:

    标签: java servlets servlet-filters


    【解决方案1】:

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

    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,则结果不正确。此外,getRequestURL() 的 javadoc 说:由于此方法返回的是 StringBuffer,而不是字符串,因此您可以轻松修改 URL,例如,附加查询参数 那么为什么不这样做呢?
    • 谢谢@Andreas,我已经更新了我的答案,对getQueryString() 进行空值检查,并使用StringBuffer 填充URL 的其余部分。
    • 不,你没有。此代码甚至无法编译。 getRequestURL() 不会返回 String,正如 @Andreas 已经指出的那样,即使它确实执行了后续的 append() 调用,它们对调用它们的字符串也没有任何作用。
    • 我的错误@EJP...我确定我将String url 更改为StringBuffer url,但我应该仔细检查一下。感谢您指出。
    • 最初的答案足以大致了解在 API 中的位置,但感谢您为那些谷歌搜索更新它。
    猜你喜欢
    • 1970-01-01
    • 2012-02-03
    • 2020-07-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2011-02-04
    相关资源
    最近更新 更多