我正在构建一个网站,该网站将 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 参数的一部分!
http://www.site.com?param1=1
它从我的输入 url 参数中删除了第二个参数!在将 url 参数提交给服务器之前,我肯定会对 url 参数进行编码……这是怎么回事?
最佳答案
我无法在 Tomcat 6.0.29 上重现您的问题。还有更多的问题。也许链中的一个过滤器正在处理请求对象?
无论如何,这是一个SSCCE具有单个 JSP 的风格:
<!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>
复制'n'粘贴'n'运行它并单击链接。就在这里,我看到了以下结果:
click here
这同样可以通过浏览器地址栏直接调用的简单 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
(默认设置),在这种特殊情况下,行为与预期的一样。
关于作为 URL 的参数的 Java Servlet getParameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3756300/