App*_*pps 4 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();
Run Code Online (Sandbox Code Playgroud)
但问题是,有一个"&"将被添加到构造的URL的末尾.我不想再做一些字符串操作并删除尾随的"&".你能建议一个更好的方法吗?
这是一种常见的情况.我将简化它以说明一些解决方案:
选项#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());
Run Code Online (Sandbox Code Playgroud)
选项#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());
Run Code Online (Sandbox Code Playgroud)
选项#3 - 如果有更多元素,则添加分隔符...
StringBuffer sb = new StringBuffer();
Enumeration en = ...
while (en.hasMoreElements())
sb.append(en.nextElement());
if (en.hasMoreElements()) {
sb.append(",");
}
}
System.err.println(sb.toString());
Run Code Online (Sandbox Code Playgroud)
选项#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());
Run Code Online (Sandbox Code Playgroud)
哪个最好取决于您正在做什么的具体细节,以及性能的重要性.
我最后应该注意到,在组装常规URL和查询字符串时需要更加小心.例如,您需要在参数名称和值中正确转义任何非"无保留"(根据URL规范)的字符.如果您不小心,您最终可能会在您的网站上注入XSS攻击.
| 归档时间: |
|
| 查看次数: |
18288 次 |
| 最近记录: |