Можно ли добавить в доступные параметры запроса (HttpServletRequest)

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
10
0
20 829
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

HttpServletRequest неизменен, и изменить его невозможно.

Я обычно оборачиваю исходный 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);
}
Ответ принят как подходящий

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

Provides a convenient implementation of the HttpServletRequest interface that can be subclassed by developers wishing to adapt the request to a Servlet.

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

Вы можете привести пример?

Christian Vielma 26.03.2013 19:26

открытый класс CustomHttpServletRequestWrapper расширяет HttpServletRequestWrapper {private Map <String, String> customParameters; общедоступный CustomHttpServletRequestWrapper (запрос HttpServletRequest) {супер (запрос); } public void addCustomParameter (имя строки, значение строки) {customParameters.put (имя, значение); } @Override public String getParameter (String name) {String originalParameter = super.getParameter (имя); если (originalParameter! = null) {вернуть originalParameter; } else {return customParameters.get (имя); }}}

Riccati 15.07.2015 18:38

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

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

Vivek Kodira 14.10.2008 19:59

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

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

Vivek Kodira 14.10.2008 20:00

Вы можете обернуть 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);
    }
}
}

Другие вопросы по теме