小编典典

当原始请求用HttpServletRequestWrapper包装时,jsp:param不再设置参数

jsp

我有一个过滤器,该过滤器接收传入的请求,然后使用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标准操作的实现源,我真的很难确定会发生什么,但是那里肯定有一些冲突。任何帮助,将不胜感激。


阅读 304

收藏
2020-06-10

共1个答案

小编典典

我想问题是您的包装程序不提供对新参数的访问,这些参数在复制后已添加到原始参数映射中。

可能您应该执行以下操作(以及其他方法):

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;  
}
2020-06-10