我正在使用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完全相同的方式对其进行了配置。
任何人都可以解释正在发生的事情以及如何解决吗?
答案 0 :(得分:0)
我解决了这个问题。我必须在自己的-Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
中设置-Dorg.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true
和JAVA_OPTS
。
有关更多详细信息,请参阅以下内容: