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

Java ApplicationHttpRequest在解析请求参数时将参数加倍,java,tomcat8,catalina,Java,Tomcat8,Catalina,我的servlet中有一个http get请求: /servlet?param1=val1&param2=val2&...&param5=val5 它从Catalina库对象作为ApplicationHttpRequest访问servlet,并且它将queryParamString和queryString都设置为上面的查询字符串 然后,当我在其中调用request.getParameterparam1时,它将调用parseParameters,它将填充请求上的param

我的servlet中有一个http get请求:

/servlet?param1=val1&param2=val2&...&param5=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中的代码