用于作为URL的param的Java Servlet getParameter

时间:2010-09-20 23:39:30

标签: java url servlets parameters encode

我正在构建一个站点,该站点将一个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&param2=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提交到服务器之前对其进行编码......发生了什么事?

1 个答案:

答案 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然后点击链接。在这里,我看到以下结果:

  

点击这里

     

网址: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"));
}

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