Можно ли добавить к доступным параметрам запроса (HttpServletRequest) - PullRequest
9 голосов
/ 10 октября 2008

Я хочу перехватить запрос в фильтре / сервлете и добавить к нему несколько параметров. Однако запрос не предоставляет метод setParameter, а сопоставление параметров при манипулировании выдает ошибку, говорящую о его блокировке. Есть ли альтернатива, которую я могу попробовать?

Ответы [ 6 ]

12 голосов
/ 10 октября 2008

Подкласс HttpServletRequestWrapper и переопределить методы getParameter. Описание этого класса гласит:

Обеспечивает удобную реализацию интерфейса HttpServletRequest, который может быть разделен на подклассы разработчиками, желающими адаптировать запрос к сервлету.

В фильтре оберните запрос в экземпляр вашего подкласса.

6 голосов
/ 10 октября 2008

Обычно я оборачиваю исходный HttpServletRequest в новый CustomHttpServletRequest, который действует как прокси для исходного запроса, а затем передаю этот новый CustomHttpServletRequest в цепочку фильтров.

В этом CustomHttpServletRequest вы можете переопределить методы getParameterNames, getParameter, getParameterMap для возврата любых параметров, которые вы хотите.

Это пример фильтра:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletRequest customRequest = new CustomHttpServletRequest(httpRequest);
    customRequest.addParameter(xxx, "xxx");
    chain.doFilter(customRequest, response);
}
1 голос
/ 12 ноября 2015

Вы можете заключить HttpServletRequest в новый объект HttpServletRequestWrapper и перезаписать некоторые методы.

Следующий код от http://www.ocpsoft.org/opensource/how-to-safely-add-modify-servlet-request-parameter-values/.

Чтобы добавить параметр в фильтр:

public class MyFilter implements Filter {
...
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    if (request instanceof HttpServletRequest) {
        HttpServletRequest httprequest = (HttpServletRequest) request;
        Map<String, String[]> extraParams = new HashMap<String, String[]>();
        extraParams.put("myparamname", String[] { "myparamvalue" });
        request = new WrappedRequestWithParameter(httprequest, extraParams);
    }
    chain.doFilter(request, response);
}
...

class WrappedRequestWithParameter extends HttpServletRequestWrapper {
    private final Map<String, String[]> modifiableParameters;
    private Map<String, String[]> allParameters = null;

    public WrappedRequestWithParameter(final HttpServletRequest request, final Map<String, String[]> additionalParams) {
        super(request);
        modifiableParameters = new TreeMap<String, String[]>();
        modifiableParameters.putAll(additionalParams);
    }

    @Override
    public String getParameter(final String name) {
        String[] strings = getParameterMap().get(name);
        if (strings != null) {
            return strings[0];
        }
        return super.getParameter(name);
    }

    @Override
    public Map<String, String[]> getParameterMap() {
        if (allParameters == null) {
            allParameters = new TreeMap<String, String[]>();
            allParameters.putAll(super.getParameterMap());
            allParameters.putAll(modifiableParameters);
        }
        // Return an unmodifiable collection because we need to uphold the interface contract.
        return Collections.unmodifiableMap(allParameters);
    }

    @Override
    public Enumeration<String> getParameterNames() {
        return Collections.enumeration(getParameterMap().keySet());
    }

    @Override
    public String[] getParameterValues(final String name) {
        return getParameterMap().get(name);
    }
}
}
1 голос
/ 10 октября 2008

Сначала вы должны получить запрос и прочитать все его параметры. Затем создайте еще один запрос с исходными параметрами + новыми и отправьте его снова.

Запрос HttpServletRequest является неизменным, и изменить его невозможно.

0 голосов
/ 12 октября 2008

Почему бы вам просто не сохранить переменные как атрибуты области запроса вместо того, чтобы пытаться добавить их к параметрам запроса?

0 голосов
/ 10 октября 2008

В противном случае вы можете использовать метод setAttribute (), который строго типизирован. Поэтому можно использовать метод getAttribute () ...

...