jsp: param больше не устанавливает параметры, когда исходный запрос заключен в HttpServletRequestWrapper - PullRequest
1 голос
/ 03 февраля 2010

У меня есть фильтр, который принимает входящий запрос, а затем оборачивает его HttpServletRequestWrapper, который, в свою очередь, содержит метод setParameter (). Однако теперь это не будет работать в любых отфильтрованных сервлетах:

<jsp:include page="testing-include.jsp">
    <jsp:param name="testing" value="testing" />
</jsp:include>

Страница включения не будет принимать параметр запроса. Если я удаляю фильтр и исходный неизмененный запрос отправляется (разворачивается) сервлету, то он снова работает. Вот моя обертка:

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, но там должен быть какой-то конфликт. Любая помощь будет оценена.

1 Ответ

1 голос
/ 03 февраля 2010

Думаю, проблема в том, что ваша оболочка не предоставляет доступ к новым параметрам, которые были добавлены в исходную карту параметров после того, как вы скопировали ее.

Возможно, вы должны сделать что-то вроде этого (и в других методах тоже):

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;  
}
...