Java Servlet中如何获取参数为URL的getParameter方法

10

我正在构建一个网站,它会将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参数包含其自身参数的情况下...

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参数!

http://www.site.com?param1=1

我的输入URL参数中缺失了第二个参数!我肯定在提交之前对URL参数进行了编码…这是怎么回事?


无法在Tomcat 6.0.29上重现此问题。使用的Servlet容器是哪个? - BalusC
使用Tomcat 6.0.29。我的servlet正在扩展HttpServlet。 - Michael Balint
和 BalusC 一样,我无法在 Tomcat 5.5 或 6 中重现您的错误。没有必要对任何文本进行编码/解码。您能展示一下您的客户端代码/表单吗? - Sean
1个回答

12

我无法在Tomcat 6.0.29上重现你的问题。可能有更多的问题,也许链中的过滤器正在对请求对象执行某些操作?

无论如何,这是一个单独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>

复制粘贴并运行它,然后单击链接。在这里我看到以下结果:

点击这里

URL: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编码(这是预设值),在这种特定情况下的行为也是符合预期的。


谢谢,问题在于我正在通过表单将我的URL提交到另一个页面。第二个页面正在使用ajax调用服务器。在这个过程中,URL被解码,所以在调用servlet之前我必须再次编码。 - Michael Balint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接