Добавление HTTP-заголовка к запросу в фильтре сервлета

Я интегрируюсь с существующим сервлетом, который вытаскивает некоторые свойства из HTTP-заголовка. В основном я реализую интерфейс, который не имеет доступа к фактическому запросу, он просто имеет доступ к карте k-> v для HTTP-заголовков.

Я должен передать в параметре запроса. План состоит в том, чтобы использовать фильтр сервлета для движения от параметра до значения заголовка, но конечно объект HttpServletRequest не имеет addHeader () методом.

Какие-либо идеи?

37
задан Mason 11 May 2010 в 14:58
поделиться

2 ответа

Extend HttpServletRequestWrapper , переопределите геттеры заголовка, чтобы также вернуть параметры:

public class AddParamsToHeader extends HttpServletRequestWrapper {
    public AddParamsToHeader(HttpServletRequest request) {
        super(request);
    }

    public String getHeader(String name) {
        String header = super.getHeader(name);
        return (header != null) ? header : super.getParameter(name); // Note: you can't use getParameterValues() here.
    }

    public Enumeration getHeaderNames() {
        List<String> names = Collections.list(super.getHeaderNames());
        names.addAll(Collections.list(super.getParameterNames()));
        return Collections.enumeration(names);
    }
}

.. и заключить в него исходный запрос:

chain.doFilter(new AddParamsToHeader((HttpServletRequest) request), response);

Тем не менее, я лично считаю это плохой идеей. Скорее предоставьте ему прямой доступ к параметрам или передайте ему параметры.

40
ответ дан 27 November 2019 в 04:34
поделиться

Вам придется использовать HttpServletRequestWrapper :

public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
    final HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(httpRequest) {
        @Override
        public String getHeader(String name) {
            final String value = request.getParameter(name);
            if (value != null) {
                return value;
            }
            return super.getHeader(name);
        }
    };
    chain.doFilter(wrapper, response);
}

В зависимости от того, что вы хотите сделать, вам может понадобиться для реализации других методов оболочки, например getHeaderNames . Просто имейте в виду, что это означает доверие к клиенту и позволяет ему манипулировать любым HTTP-заголовком. Вы можете поместить его в песочницу и разрешить изменять таким образом только определенные значения заголовка.

15
ответ дан 27 November 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: