我有一个过滤器,该过滤器接收传入的请求,然后使用HttpServletRequestWrapper对其进行包装,而HttpServletRequestWrapper上又具有setParameter()方法。但是,这现在在任何过滤的servlet中将不再起作用:
<jsp:include page="testing-include.jsp"> <jsp:param name="testing" value="testing" /> </jsp:include>
包含页面将不使用request参数。如果我删除了过滤器,并且原始的未修改请求被发送(解包)到了servlet,那么它将再次起作用。这是我的包装纸:
public class HttpServletModifiedRequestWrapper extends HttpServletRequestWrapper { Map parameters; @SuppressWarnings("unchecked") public HttpServletModifiedRequestWrapper(HttpServletRequest httpServletRequest) { super(httpServletRequest); parameters = new HashMap(httpServletRequest.getParameterMap()); } public String getParameter(String name) { String returnValue = null; String[] paramArray = getParameterValues(name); if (paramArray != null && paramArray.length > 0){ returnValue = paramArray[0]; } return returnValue; } @SuppressWarnings("unchecked") public Map getParameterMap() { return Collections.unmodifiableMap(parameters); } @SuppressWarnings("unchecked") public Enumeration getParameterNames() { return Collections.enumeration(parameters.keySet()); } public String[] getParameterValues(String name) { String[] result = null; String[] temp = (String[]) parameters.get(name); if (temp != null){ result = new String[temp.length]; System.arraycopy(temp, 0, result, 0, temp.length); } return result; } public void setParameter(String name, String value){ String[] oneParam = {value}; setParameter(name, oneParam); } @SuppressWarnings("unchecked") public void setParameter(String name, String[] values){ parameters.put(name, values); } }
如果不查看Tomcat的jsp:include和jsp:param标准操作的实现源,我真的很难确定会发生什么,但是那里肯定有一些冲突。任何帮助,将不胜感激。
我想问题是您的包装程序不提供对新参数的访问,这些参数在复制后已添加到原始参数映射中。
可能您应该执行以下操作(以及其他方法):
public String[] getParameterValues(String name) { String[] result = null; String[] temp = (String[]) parameters.get(name); if (temp != null){ result = new String[temp.length]; System.arraycopy(temp, 0, result, 0, temp.length); } else { return super.getParameterValues(name); } return result; }