用于作为URL的param的Java Servlet getParameter

Mic*_*int 9 java parameters url encode servlets

我正在构建一个站点,它将一个URL提交给servlet以进行分析.在客户端,我提交url作为编码的参数.例如...

Submit: http://www.site.com
Goes to: http://localhost/myservlet/?url=http%3A%2F%2Fwww.site.com
Run Code Online (Sandbox Code Playgroud)

在服务器端,我有我的servlet请求参数,如此...

String url = request.getParameter("url");
Run Code Online (Sandbox Code Playgroud)

我收到的是一个解码字符串:http://www.site.com.到目前为止一切都很好 - 这大部分时间都按预期工作.

当url param包含自己的参数时会发生问题...

Submit: http://www.site.com?param1=1&param2=2
Goes to: http://localhost/myservlet/?url=http%3A%2F%2Fwww.site.com%3Fparam1%3D1%26param2%3D2
Run Code Online (Sandbox Code Playgroud)

在客户端站点上一切都很好,但在我的servlet中,当我得到参数时,我只收到url param的一部分!

http://www.site.com?param1=1
Run Code Online (Sandbox Code Playgroud)

它从我输入的url param中删除了第二个参数!我肯定在将url param提交到服务器之前对其进行编码...发生了什么?

Bal*_*usC 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>
Run Code Online (Sandbox Code Playgroud)

Copy'n'paste'n'run它并点击链接.就在这里,我看到以下结果:

点击这里

网址:http://www.site.com? param1 = 1&param2 = 2

使用像这样的简单servlet可以重现这一点,它由浏览器地址栏直接调用:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.getWriter().write(request.getParameter("url"));
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,Tomcat是URIEncoding="UTF-8"在HTTP连接器中配置的,但即使使用ISO-8859-1(这是默认设置),在这种特殊情况下,行为也是预期的 - 相同.