作为 URL 的参数的 Java Servlet getParameter

标签 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 参数的一部分!

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

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 的参数的 Java Servlet getParameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3756300/

相关文章:

java - Spring MVC 对 Controller 映射非常困惑

java - commons-logging-api-1.1.jar 与 commons-logging-1.2.jar

java - Java CRC32 实现在 32 位和 64 位上是否有所不同

java - java中有多个main方法会怎样?

validation - 哪些字符会使 URL 无效?

java - Android - 将参数传递给 Android 应用程序中的 RESTful URL

Java SipServlet 构建 VOIP 电话调用(在计算机和模拟电话/手机之间)

android - 单击链接而不是浏览器打开我的应用程序 - Android

javascript - 隐藏字段是否总是提交项目列表中的第一个值?

java - 使用jsp作为服务器端脚本将文件上传到特定文件夹