Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java中的请求参数构造URL_Java_Jakarta Ee_Http Request Parameters - Fatal编程技术网

用Java中的请求参数构造URL

用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() ){

我有一个通过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的末尾。我不想再次执行一些字符串操作并删除尾随的“&”。您能推荐一种更好的方法吗?

请看这个问题,如何从某种集合轻松构建字符串:

您的代码还有一个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攻击的向量。

我通常就是这样解决这些问题的