我正在构建一个站点,该站点将一个URL提交给servlet以进行分析。在客户端,我提交url作为编码的参数。例如......
Submit: http://www.site.com
Goes to: http://localhost/myservlet/?url=http%3A%2F%2Fwww.site.com
在服务器端,我的servlet请求参数如此......
String url = request.getParameter("url");
我收到的是解码后的字符串:http://www.site.com。到目前为止一切都很好 - 这大部分时间都按预期工作。
当url param包含自己的参数时会出现问题...
Submit: http://www.site.com?param1=1¶m2=2
Goes to: http://localhost/myservlet/?url=http%3A%2F%2Fwww.site.com%3Fparam1%3D1%26param2%3D2
客户端站点上的一切都很好,但是当我获得参数时,在我的servlet中,我只收到了url param的一部分!
http://www.site.com?param1=1
它从我输入的url param中删除了第二个参数!我肯定在将url param提交到服务器之前对其进行编码......发生了什么事?
答案 0 :(得分:12)
我无法在Tomcat 6.0.29上重现您的问题。事情还有更多。也许链中的Filter正在对请求对象做一些事情?
无论如何,这是一个JSP的SSCCE:
<!DOCTYPE html>
<html lang="en">
<head>
<title>Test</title>
</head>
<body>
<p><a href="?url=http%3A%2F%2Fwww.site.com%3Fparam1%3D1%26param2%3D2">click here</a>
<p>URL: ${param.url}
</body>
</html>
Copy'n'paste'n'run然后点击链接。在这里,我看到以下结果:
点击这里
使用像这样的简单servlet可以重现它,它可以直接由浏览器地址栏调用:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write(request.getParameter("url"));
}
顺便说一句,Tomcat在HTTP连接器中使用URIEncoding="UTF-8"
进行配置,但即使使用ISO-8859-1
(这是默认设置),行为在此特定情况下也是预期的 - 相同。