URI中的斜杠(/)给出了来自Tomcat的HTTP 400错误请求错误

时间:2018-10-11 05:30:07

标签: tomcat utf-8 bad-request

我正在使用Tomcat 7.0.54.0。

我的应用程序中有一个使用GET方法的REST API。在此API的URI中,在调用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版本,OS环境(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 :(得分:0)

我解决了这个问题。我必须在自己的-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true中设置-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=trueJAVA_OPTS

有关更多详细信息,请参阅以下内容:

Configuring Tomcat for encoded slashes in the URL