Я использую 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.
Может кто-нибудь объяснить, что происходит и как это исправить?