Java ApplicationHttpRequest在解析请求参数时将参数加倍
我的servlet中有一个http get请求:Java ApplicationHttpRequest在解析请求参数时将参数加倍,java,tomcat8,catalina,Java,Tomcat8,Catalina,我的servlet中有一个http get请求: /servlet?param1=val1¶m2=val2&...¶m5=val5 它从Catalina库对象作为ApplicationHttpRequest访问servlet,并且它将queryParamString和queryString都设置为上面的查询字符串 然后,当我在其中调用request.getParameterparam1时,它将调用parseParameters,它将填充请求上的param
/servlet?param1=val1¶m2=val2&...¶m5=val5
它从Catalina库对象作为ApplicationHttpRequest访问servlet,并且它将queryParamString和queryString都设置为上面的查询字符串
然后,当我在其中调用request.getParameterparam1时,它将调用parseParameters,它将填充请求上的parameters对象
奇怪的是,它像这样填充它:
[
0 => ["val1","val1"] ,
1 => ["val2","val2"] ,
2 => ["val3","val3"] ,
3 => ["val4","val4"] ,
4 => ["val5","val5"]
]
这是在Tomcat8提供的类中发生的,因为我已经在我的调试器8.0.33和8.0.41版本上尝试过它们
有人知道为什么会这样吗?这看起来根本不像预期的行为
谢谢大家!
PS.从Tomcat应用程序中选择涉及的方法:
public String getParameter(String name) {
parseParameters();
String[] value = parameters.get(name);
if (value == null) {
return null;
}
return value[0];
}
void parseParameters() {
if (parsedParams) {
return;
}
parameters = new ParameterMap<>();
parameters.putAll(getRequest().getParameterMap());
mergeParameters();
((ParameterMap<String,String[]>) parameters).setLocked(true);
parsedParams = true;
}
private void mergeParameters() {
if ((queryParamString == null) || (queryParamString.length() < 1))
return;
// Parse the query string from the dispatch target
Parameters paramParser = new Parameters();
MessageBytes queryMB = MessageBytes.newInstance();
queryMB.setString(queryParamString);
String encoding = getCharacterEncoding();
// No need to process null value, as ISO-8859-1 is the default encoding
// in MessageBytes.toBytes().
if (encoding != null) {
try {
queryMB.setCharset(B2CConverter.getCharset(encoding));
} catch (UnsupportedEncodingException ignored) {
// Fall-back to ISO-8859-1
}
}
paramParser.setQuery(queryMB);
paramParser.setQueryStringEncoding(encoding);
paramParser.handleQueryParameters();
// Insert the additional parameters from the dispatch target
Enumeration<String> dispParamNames = paramParser.getParameterNames();
while (dispParamNames.hasMoreElements()) {
String dispParamName = dispParamNames.nextElement();
String[] dispParamValues = paramParser.getParameterValues(dispParamName);
String[] originalValues = parameters.get(dispParamName);
if (originalValues == null) {
parameters.put(dispParamName, dispParamValues);
continue;
}
parameters.put(dispParamName, mergeValues(dispParamValues, originalValues));
}
}
protected String[] mergeValues(Object values1, Object values2) {
ArrayList<Object> results = new ArrayList<>();
if (values1 == null) {
// Skip - nothing to merge
} else if (values1 instanceof String[]) {
for (String value : (String[]) values1) {
results.add(value);
}
} else { // String
results.add(values1.toString());
}
if (values2 == null) {
// Skip - nothing to merge
} else if (values2 instanceof String[]) {
for (String value : (String[]) values2) {
results.add(value);
}
} else { // String
results.add(values2.toString());
}
String values[] = new String[results.size()];
return results.toArray(values);
}
请出示有双重参数的证明@Loc等等parseParameters我正在点击mergeParameters,它使用mergeValues。在mergeValues中,它有value1和value2,对于param1,这两个值都是value1。mergeValues的结果是一个具有2个元素的数组-[value1,value1]表示param1。同样,对于所有其他元素,它也在做同样的事情。这将冒泡到ApplicationHttpRequest对象。我正在寻找一个更详细的解释,谢谢你的建议。我的意思是,请展示一些代码来说明这个问题。@Loc这是应用程序HttpRequest中涉及的代码。请展示你的证据,证明存在双重参数@Loc等等parseParameters我正在点击mergeParameters,它使用mergeValues。在mergeValues中,它有value1和value2,对于param1,这两个值都是value1。mergeValues的结果是一个具有2个元素的数组-[value1,value1]表示param1。同样,对于所有其他元素,它也在做同样的事情。这将冒泡到ApplicationHttpRequest对象。目前我自己正在寻找更详细的解释,任何建议都将不胜感激。我的意思是,请显示一些显示该问题的代码。@Loc这里是涉及此问题的ApplicationHttpRequest中的代码