Spring "Запрос был отклонен, потому что URL не был нормализован."Как узнать, какой URL был использован? - PullRequest
0 голосов
/ 02 февраля 2019

Я получаю кучу ошибок при производстве

org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL was not normalized.

Возможно, это вызвано // в моих URL, но я понятия не имею, откуда они берутся.Как я могу сказать, что URL вызывает это?Трудно исправить, если вы не знаете, что происходит.

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

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

HttpFirewall проверит запрос в самом начале в FilterChainProxy даже до вызова каких-либо фильтров в SecurityFilterChain.Таким образом, вам лучше всего установить Filter, который находится перед FilterChainProxy, и этот Filter используется для перехвата RequestRejectedException и регистрации его данных.

(1) Реализация фильтракоторые ловят это исключение:

public class LogFilter implements Filter{

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
        try {
            chain.doFilter(request, response);
        } catch (Exception e) {
            if( e instanceof RequestRejectedException ) {
                logger.info("Catch RequestRejectedException....");
                logger.info((HttpServletRequest)request).getRequestURI()); //log the request detail such as its URI
            }
            throw e;
        }
    }
}

(2) Сконфигурируйте и зарегистрируйте фильтр

@Bean
public FilterRegistrationBean someFilterRegistration() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new LogFilter());
    registration.addUrlPatterns("/*");
    registration.setOrder(RegistrationBean.HIGHEST_PRECEDENCE); //Must has higher precedence than FilterChainProxy
    return registration;
} 
0 голосов
/ 02 февраля 2019

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

Вы пробовали другой уровень ведения журнала и вход в файл?Я сейчас не дома, но если нет, попробуйте следующие строки:

logging.level.=ERROR
logging.file=/home/spring.log

Возможно, также попробуйте DEBUG в качестве уровня ведения журнала

Otherwhys (хотя и немного хакерский) попробоватьпросто заменить каждый // на /

В качестве третьего варианта я нашел этот скрипт, вы можете заставить его работать.

@ExceptionHandler(RequestRejectedException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleRequestRejectedException(final HttpServletRequest request, final RequestRejectedException ex)
{
    if (LOGGER.isLoggable(Level.INFO))
    {
        LOGGER.log(Level.INFO, "Request Rejected", ex);
    }

    LOGGER.log(Level.WARNING, "Rejected request for [" + request.getRequestURL().toString() + "]. Reason: " + ex.getMessage());
    return "errorPage";
}

Удачи, если вам не удастся, я вернусь завтра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...