Подтвердить что ты не робот

Как установить предупреждение о запросе параметров запроса POST?

Я создаю очень простой REST API, используя Джерси, и у меня есть предупреждение в моих файлах журналов, о которых я не уверен.

ПРЕДУПРЕЖДЕНИЕ: запрос POST сервлета, чтобы URI http://myserver/mycontext/myapi/users/12345?action=delete, содержит параметры формы в но орган запроса имеет потребляется сервлетом или сервлет-фильтр, доступ к запросу параметры. Только методы ресурсов использование @FormParam будет работать как ожидается. Потребляемые ресурсы орган запроса другими способами будет не работает должным образом.

В моем веб-браузере установлен только сервлет-сержант, сопоставленный с /myapi/ *

Как я могу остановить эти предупреждения?

4b9b3361

Ответ 1

Для меня предупреждение было показано для приложения POST/x-www-form-urlencoded. И я использую Spring Boot, у которого есть HiddenHttpMethodFilter, который делает getParameter раньше всего... Итак, я закончил делать это неприятное переопределение:

@Bean
    public HiddenHttpMethodFilter hiddenHttpMethodFilter() {
        return new HiddenHttpMethodFilter() {
            @Override
            protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
                    FilterChain filterChain) throws ServletException, IOException {
                if ("POST".equals(request.getMethod())
                        && request.getContentType().equals(MediaType.APPLICATION_FORM_URLENCODED_VALUE)) {
                    filterChain.doFilter(request, response);
                } else {
                    super.doFilterInternal(request, response, filterChain);
                }
            }
        };
    }

Ответ 2

Это сообщение предназначено для предупреждения разработчиков о том, что тело объекта запроса было уничтожено, поэтому любые другие попытки прочитать тело сообщения потерпят неудачу.

Безопасно игнорировать сообщение или отфильтровывать его из журналов:

java.util.logging.Logger jerseyLogger =
        java.util.logging.Logger.getLogger(WebComponent.class.getName());
jerseyLogger.setFilter(new Filter() {
    @Override
    public boolean isLoggable(LogRecord record) {
        boolean isLoggable = true;
        if (record.getMessage().contains("Only resource methods using @FormParam")) {
            isLoggable = false;
        }
        return isLoggable;
    }
});

Ответ 3

Следующий поток описывает предупреждение, которое вы получаете. Похоже, что у вас может быть фильтр, определенный в вашем web.xml, который обрабатывает запрос до того, как Джерси сделает.

Ответ 4

Наконец-то избавился от этого, убедившись, что у меня в заголовках запросов (очевидно, на стороне клиента) Content-Type: application/json

Ответ 5

У меня просто была моя функция ajax в JQuery, установленная на contentType: "application/x-www-form-urlencoded; charset=UTF-8", потому что с предыдущим решением (без Джерси) у меня были некоторые проблемы с кодировкой. Когда я удалил сообщение, оно исчезло, и все сработало нормально.

Ответ 6

Это предупреждение - единственное, что регистрируется в WebComponent, поэтому просто включите ведение журнала до уровня ERROR или отключите ведение журнала для этого компонента в вашем файле logback.xml или везде, где вы настроили протокол. Вам не нужно писать настраиваемый фильтр, чтобы игнорировать это конкретное сообщение, так как нет других сообщений, зарегистрированных из этого компонента.

Исходный код фрагмента из org.glassfish.jersey.servlet.WebComponent версии 2.14:

        if(!form.asMap().isEmpty()) {
            containerRequest.setProperty("jersey.config.server.representation.decoded.form", form);
            if(LOGGER.isLoggable(Level.WARNING)) {
                LOGGER.log(Level.WARNING, LocalizationMessages.FORM_PARAM_CONSUMED(containerRequest.getRequestUri()));
            }
        }

Локализованное сообщение, которое используется для этого предупреждающего сообщения:

form.param.consumed=A servlet request to the URI {0} contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.

Отключите ведение журнала для WebComponent в вашем файле logback.xml следующим образом:

<logger name="org.glassfish.jersey.servlet.WebComponent" level="OFF" additivity="false"/>

Ответ 7

Right. Так что я страдаю этой проблемой, и я пытался ее решить по-разному, но я не хотел менять настройки web.xml, потому что, если я тестировал свое приложение с помощью Postman, он работал отлично, но когда он был интегрирован с webapp, он терпит неудачу с указанной проблемой (A servlet request to the URI {MY_URI} contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.)

Итак, как упоминалось в @clijk, вы должны только настроить свои заголовки как:

"Content-Type":"application/json"
"charset":"UTF-8"

и voilá, предупреждение это исчезло.

Спасибо

Ответ 8

В моем случае я исправил эту ошибку, когда я изменил объект Дата на Строка в методе.

Ошибка:

@POST
@Path("/myPath")
@Produces(MediaType.APPLICATION_JSON)
public List<MyObject> myMethod(@FormParam("StartDate") Date date) throws Exception {

Фиксированный

@POST
@Path("/myPath")
@Produces(MediaType.APPLICATION_JSON)
public List<MyObject> myMethod(@FormParam("StartDate") String date) throws Exception {

Ответ 9

Поместите это в свою подпись ресурса. Или найдите эту строку в вашем проекте, кто-то уже использует ее, если используется @PUT или @POST. Это должно помочь

import javax.ws.rs.Consumes;

@Consumes(MediaType.APPLICATION_JSON)