使用Java中的请求参数构造URL

时间:2011-07-08 09:18:32

标签: java java-ee http-request-parameters

我有一个通过URL访问的servlet,该URL中有一些请求参数。现在我需要将用户重定向到另一个页面(来自servlet),还要附加我从请求中获取的请求参数。 这就是我正在做的事情

    StringBuffer sb=new StringBuffer("/test.jsp");
    sb.append( "?" );
    Enumeration en = request.getParameterNames();
    while( en.hasMoreElements() ){
        String paramName = (String) en.nextElement();
        sb.append( paramName );
        sb.append( "=" );
        sb.append(request.getParameter( paramName ));
        sb.append("&");
    }
           String constructedURLWithParams=sb.toString();

但问题是,有一个“&”这将添加到构造的URL的末尾。我不想再做一些字符串操作并删除尾随的“&”。你能建议一个更好的方法吗?

3 个答案:

答案 0 :(得分:6)

这是常见的情况。我将简化它以说明一些解决方案:


选项#1 - 通过更改StringBuffer长度删除最后一个字符:

StringBuffer sb = new StringBuffer();
Enumeration en = ...
while (en.hasMoreElements())
    sb.append(en.nextElement());
    sb.append(",");
}
if (sb.length() > 0) {
    sb.setLength(sb.length() - 1);
}
System.err.println(sb.toString());

选项#2 - 如果缓冲区非空,则添加分隔符

StringBuffer sb = new StringBuffer();
Enumeration en = ...
while (en.hasMoreElements())
    if (sb.length() > 0) {
        sb.append(",");
    }
    sb.append(en.nextElement());
}
System.err.println(sb.toString());

选项#3 - 如果有更多元素,则添加分隔符...

StringBuffer sb = new StringBuffer();
Enumeration en = ...
while (en.hasMoreElements())
    sb.append(en.nextElement());
    if (en.hasMoreElements()) {
        sb.append(",");
    }
}
System.err.println(sb.toString());

选项#4 - 如果这不是第一次循环,则添加分隔符...

StringBuffer sb = new StringBuffer();
Enumeration en = ...
boolean first = true;
while (en.hasMoreElements())
    if (first) {
        first = false;
    } else {
        sb.append(",");
    }
    sb.append(en.nextElement());
}
System.err.println(sb.toString());

哪个最好取决于您正在做什么的具体细节,以及性能的重要程度。


我最后应该注意,在组装常规URL和查询字符串时需要更加小心。例如,您需要在参数名称和值中正确转义任何非“无保留”(根据URL规范)的字符。如果您不小心,最终可能会在您的网站上注射XSS攻击的载体。

答案 1 :(得分:4)

请参阅此问题,了解如何从某种集合中轻松构建String:What's the most elegant way to concatenate a list of values with delimiter in Java?

此外,您的代码有一个错误:您必须转义值,因为paramName和请求参数都可以包含&和其他非法字符。请使用URLEncoder.encode(value, "UTF-8")

答案 2 :(得分:3)

只需附加"?" + request.getQueryString()(如果参数在URL中传递 - 查询字符串包含所有get参数)

如果他们不是,那么你的方法似乎很好。只是

if (en.hasMoreElements()) sb.append("&");