我有一个http get请求进入我的servlet:
/servlet?param1=val1¶m2=val2&...¶m5=val5
它将servlet作为ApplicationHttpRequest(来自Catalina库)对象,它将queryParamString和queryString都设置为上面的查询字符串。
然后当我在其中调用request.getParameter(“param1”)时,它调用parseParameters()来填充请求中的参数对象。
奇怪的是它像这样填充它:
[
0 => ["val1","val1"] ,
1 => ["val2","val2"] ,
2 => ["val3","val3"] ,
3 => ["val4","val4"] ,
4 => ["val5","val5"]
]
这是在tomcat 8提供的类中发生的,因为我在我的调试器上逐步完成了它们(我已经尝试了8.0.33和8.0.41版本)。
任何人都知道为什么会这样?这似乎不是预期的行为。
谢谢!
PS。从Tomcat Application中选择涉及的方法:
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);
}