ApplicationHttpRequest在解析请求参数时将参数加倍

时间:2017-03-07 19:15:47

标签: java tomcat8 catalina

我有一个http get请求进入我的servlet:

/servlet?param1=val1&param2=val2&...&param5=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);

}

0 个答案:

没有答案