为什么此URL从Tomcat返回错误400?

我有一个运行Java servlet的Tomcat服务器。 我正在尝试创建一个返回存储文件的servlet,给定它们的加密ID。

ID:100

加密ID:+ e4 / E5cR / aM =

URL编码的ID:%2Be4%2FE5cR%2FaM%3D

生成的URL: http:// localhost / file / demo /%2Be4%2FE5cR%2FaM%3D

当我尝试关注该链接时,我甚至没有进入我的servlet代码 – 服务器返回此错误: 无法加载资源:服务器响应状态为400(错误请求)

这个URL让Tomcat在到达我的代码之前拒绝了它有什么问题? 我通过URL编码器运行它,我没有看到任何无效字符。

您在url中使用斜杠“/”编码。 由于潜在的攻击,Apache不允许它们。 有设置允许他们:

System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true"); 

要么

 -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true 

看到类似的post 。

您可能遇到以下两个问题之一:

1)您尚未在URL中包含该端口。 您已将Tomcat端口配置为端口80,在这种情况下不需要端口,或者您需要包含端口,默认为8080,例如:

 http://localhost:8080/file/demo/%2Be4%2FE5cR%2FaM%3D 

2)您正在将加密的ID添加为URL本身的一部分,该URL必须映射到URL映射中某种类型的Servlet / JSP / View,并且不太可能。 Tomcat不会识别唯一ID并且知道要调用的相应处理程序来处理映射。 假设您打算调用映射到’/ file / demo’的servlet / JSP /控制器,您更可能希望将ID作为请求参数传递,例如:

 http://localhost:8080/file/demo?id=%2Be4%2FE5cR%2FaM%3D