先上代碼
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException
{
Enumeration e = req.getParameterNames();
String attributeName;
String attributeValues[];
output(req);
while (e.hasMoreElements()) {
attributeName = (String) e.nextElement();
attributeValues = req.getParameterValues(attributeName);
// a = req.getParameter(attributeName);
attributeValues[0] = "hasUpdated";
}
output(req);
chain.doFilter(req, resp);
}
問題是第9行的代碼是否有改變請求中的參數值?
測試了多個tomcat,在tomcat6.0.13中會改變,看了下tomcat的源碼,不會改變參數值的代碼都是這樣寫的,採用的是ApplicationHttpRequest
@Override
public String[] getParameterValues(String name) {
parseParameters();
Object value = parameters.get(name);
if (value == null)
return null;
else if (value instanceof String[])
return ((String[]) value);
else if (value instanceof String) {
String values[] = new String[1];
values[0] = (String) value;
return (values);
} else {
String values[] = new String[1];
values[0] = value.toString();
return (values);
}
}
會去new一個新的字符串數組進行保存,但是tomcat6.0.13並不會進入這個request。
後續會深入研究下tomcat的源碼,及java string對象的剖析。