Косая черта (/) в URI выдает ошибку HTTP 400 Bad request от Tomcat - PullRequest
0 голосов
/ 11 октября 2018

Я использую Tomcat 7.0.54.0.

В моем приложении есть один REST API, использующий метод GET.В URI для этого API есть один символ косой черты (/), который я кодирую перед вызовом API.Пример: http://192.168.168.168:38080/myApp/getDetails/test%2Fstring.

Фактическая строка в параметре URI - test/string.Перед вызовом API я использую URLEncoder.encode("test/string", "UTF-8"), что дает мне test%2Fstring.То же, что я использовал в своем URL.

Этот вызов API отлично работает в одной среде, но для другой среды он выдает ошибку HTTP 400 (Bad request).

Версия Java, версия Tomcat, ОСсреда (Linux) и версия, они все одинаковы для обоих серверов.В server.xml я настроил порт соединителя следующим образом:

<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="38080" protocol="HTTP/1.1" redirectPort="8443"/>

Кроме того, существует фильтр кодировки символов, настроенный со следующим кодом:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
    HttpServletRequest httpRequest = null;
    HttpServletResponse httpResponse = null;

    if (request instanceof HttpServletRequest)
    {
        httpRequest = (HttpServletRequest) request;
    }

    if (response instanceof HttpServletResponse)
    {
        httpResponse = (HttpServletResponse) response;
    }

    // it means its not http request
    if (httpRequest == null || httpResponse == null)
    {
        chain.doFilter(request, response);
        return;
    }

    httpRequest.setCharacterEncoding("UTF-8");
    httpResponse.setCharacterEncoding("UTF-8");
    chain.doFilter(request, response);
}

При отладке яобнаружил, что запрос даже не достигает этого фильтра.Это означает, что сам сервер ограничивает этот URL.

Ранее этот API работал нормально, но недавно он начал вызывать эту проблему.Разница лишь в том, что я взял свежий Tomcat той же версии и настроил его точно так же, как и существующий Tomcat.

Может кто-нибудь объяснить, что происходит и как это исправить?

1 Ответ

0 голосов
/ 12 октября 2018

Я решил проблему.Мне нужно было установить -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true и -Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true в моем JAVA_OPTS.

Для получения более подробной информации обратитесь к следующему:

Настройка Tomcat для закодированных косых черт в URL

...