用Java中的请求参数构造URL
我有一个通过URL访问的servlet,该URL中有一些请求参数。现在,我需要将用户重定向到不同的页面(从servlet),但还要附加从请求中获得的请求参数。 这就是我正在做的用Java中的请求参数构造URL,java,jakarta-ee,http-request-parameters,Java,Jakarta Ee,Http Request Parameters,我有一个通过URL访问的servlet,该URL中有一些请求参数。现在,我需要将用户重定向到不同的页面(从servlet),但还要附加从请求中获得的请求参数。 这就是我正在做的 StringBuffer sb=new StringBuffer("/test.jsp"); sb.append( "?" ); Enumeration en = request.getParameterNames(); while( en.hasMoreElements() ){
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的末尾。我不想再次执行一些字符串操作并删除尾随的“&”。您能推荐一种更好的方法吗?请看这个问题,如何从某种集合轻松构建字符串: 您的代码还有一个bug:您必须转义这些值,因为
paramName
和请求参数都可能包含&
和其他非法字符。使用URLEncoder.encode(值,“UTF-8”)
。只需附加“?”+request.getQueryString()
(如果参数在URL中传递-查询字符串包含所有get参数)
如果他们不是,那么你的方法似乎很好。只要
if (en.hasMoreElements()) sb.append("&");
这是一种常见的情况。我将对其进行简化,以说明一些解决方案:
选项#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攻击的向量。我通常就是这样解决这些问题的