Я интегрируюсь с существующим сервлетом, который вытаскивает некоторые свойства из HTTP-заголовка. В основном я реализую интерфейс, который не имеет доступа к фактическому запросу, он просто имеет доступ к карте k-> v для HTTP-заголовков.
Я должен передать в параметре запроса. План состоит в том, чтобы использовать фильтр сервлета для движения от параметра до значения заголовка, но конечно объект HttpServletRequest не имеет addHeader () методом.
Какие-либо идеи?
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);
Тем не менее, я лично считаю это плохой идеей. Скорее предоставьте ему прямой доступ к параметрам или передайте ему параметры.
Вам придется использовать 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-заголовком. Вы можете поместить его в песочницу и разрешить изменять таким образом только определенные значения заголовка.