【问题标题】:Java servlet sendRequest - getParameter encoding ProblemJava servlet sendRequest - getParameter 编码问题
【发布时间】:2011-02-23 20:51:33
【问题描述】:

我正在使用 java servlet 为我的课程构建一个 Web 应用程序。在某些时候,我想重定向到一个 jsp 页面,同时发送一些想要在那里使用的信息(使用 GET 方法)。 在我的 servlet 中,我有以下代码:

String link = new String("index.jsp?name="+metadata.getName()+"&title="+metadata.getTitle());

response.sendRedirect(response.encodeRedirectURL(link));

在jsp中,我获取这些参数使用

<%
request.getParameter("name");
request.getParameter("title");
%>

一切正常,除非参数不只包含拉丁字符(在我的例子中,它们可以包含希腊字符)。 例如,如果 name=ΕΡΕΥΝΑΣ 我得到 name=¡¥。 如何解决此编码问题(将其设置为 UTF-8)? encodeRedirectURL() 不是在做这项工作吗?我还应该在某个时候使用 encodeURL() 吗?我尝试了最后一个,但问题仍然存在。

提前致谢:)

【问题讨论】:

    标签: java servlets encoding character-encoding getparameter


    【解决方案1】:

    HttpServletResponse#encodeRedirectURL() 不对 URL 进行 URL 编码。只要有会话并且客户端禁用了 cookie,它只会将 jsessionid 属性附加到 URL。诚然,这是一个令人困惑的方法名称。

    在编写 URL 时,您需要自己在 URLEncoder#encode() 的帮助下对请求参数进行编码。

    String charset = "UTF-8";
    String link = String.format("index.jsp?name=%s&title=%s", 
        URLEncoder.encode(metadata.getName(), charset), 
        URLEncoder.encode(metadata.getTitle(), charset));
    
    response.sendRedirect(response.encodeRedirectURL(link));
    

    并创建一个映射到/*filter,并在doFilter() 方法中基本上执行以下操作:

    request.setCharacterEncoding("UTF-8");
    chain.doFilter(request, response);
    

    并将以下内容添加到您的 JSP 的 顶部

    <%@ page pageEncoding="UTF-8" %>
    

    最后你将能够如下显示它们:

    <p>Name: ${param.name}</p>
    <p>Title: ${param.title}</p>
    

    另见:

    【讨论】:

    • @Will:我已经回滚了你建议的编辑。 pageEncoding="UTF-8" 不仅设置了响应编码(这是为了正确显示参数所必需的),而且它还隐式设置了Content-Type 标头中的编码。您也不需要通过contentType 明确设置它。阅读链接。
    • 感谢您打扰我的问题。我试图了解过滤器的工作原理并遵循您的建议,但我遇到了一些例外情况。我明天还要继续工作,我会回来提供一些反馈。
    • 奇怪-我在我的jspS中使用&lt;a href="userdetails?name=${username}"&gt;${username}&lt;/a&gt;,在我的控制器中使用response.sendRedirect(PROJECT_SERVLET + "?name=" + project.getName());-其中用户名和项目名称是希腊语-我唯一需要做的就是设置URIEncoding="UTF-8" (tomcat 的 7)server.xml 的 Context 标记以使 url 正确通过(它们 直接显示在浏览器中,但它们没有通过正确的服务器)。我正在使用@page 和过滤器,但我需要使用URLEncoder.encodeString.format 吗?
    • @Mr_ URLEncoder 在查询字符串中使用特殊字符时是必需的。
    • @Mr_ 不客气。 String.format 只是为了方便。我发现它比"..." + ... + "..." + ... + "..." 更具可读性。对于功能要求,这不是强制性的。
    【解决方案2】:

    使用 java.net.URLEncoder 对每个参数进行编码,然后再将它们添加到 url。这样想:如果你的名字包含一个“&”,你怎么知道这不是参数分隔符?

    【讨论】:

    • 感谢您回复 sstendal。我试过这个,但结果是一样的。也许它需要更多的东西
    【解决方案3】:

    在将每个请求参数放入查询字符串之前,您应该使用URLEncoder.encode() 对其进行编码。

    encodeRedirectURL 方法仅用于在必要时将会话 ID 包含到 URL 中(如果浏览器不支持 cookie,则 URL 重写)

    【讨论】:

      【解决方案4】:

      下面的怎么样?

      • 将名称和标题设置为请求对象的属性;
      • 从请求对象或通过 servlet 上下文获取 JSP 的请求调度程序;
      • 使用请求分派器将请求转发给 JSP;
      • 在来自 JSP 的请求中访问这些属性。

      这避免了将浏览器从第一个 servlet 重定向到 JSP 派生的 servlet,并完全避免了整个参数编码问题。

      还要确保 JSP 页面指令将内容编码设置为 UTF-8。

      【讨论】:

        猜你喜欢
        • 2012-10-28
        • 1970-01-01
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 2014-01-30
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        相关资源
        最近更新 更多