我有一个运行Java servlet的Tomcat服务器。我试图制作一个返回存储文件的servlet,给定它们的加密ID。
ID:100
加密ID:+ e4 / E5cR / aM =
网址编码ID:%2Be4%2FE5cR%2FaM%3D
生成的网址:http://localhost/file/demo/%2Be4%2FE5cR%2FaM%3D
当我尝试关注该链接时,我甚至无法访问我的servlet代码 - 服务器返回此错误:无法加载资源:服务器响应状态为400 (错误请求)
这个网址有什么问题让Tomcat在到达我的代码之前拒绝了它?我通过网址编码器运行它,但我没有看到任何无效字符。
答案 0 :(得分:7)
您在网址中删除了“/”编码。由于潜在的攻击,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 :(得分:0)
您可能遇到以下两个问题之一:
1)您没有在URL中包含该端口。您已将Tomcat端口配置为端口80,在这种情况下不需要端口,或者您需要包含端口,默认为8080,例如:
http://localhost:8080/file/demo/%2Be4%2FE5cR%2FaM%3D
2)您正在添加加密ID作为URL本身的一部分,这必须映射到URL映射中的某种Servlet / JSP / View,并且不太可能。 Tomcat不会识别唯一的ID,并且知道要调用的相应处理程序来处理映射。假设您打算调用映射到'/ file / demo'的servlet / JSP /控制器,您更可能希望将ID作为请求参数传递,例如:
http://localhost:8080/file/demo?id=%2Be4%2FE5cR%2FaM%3D