Java Servlet 发送请求 - getParameter 编码问题

3
我正在使用Java Servlet构建我的课程网页应用。在某些时候,我想要重定向到一个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()吗?我尝试了后者,但问题仍然存在。
提前感谢 :)
4个回答

8

HttpServletResponse#encodeRedirectURL() 不会对 URL 进行编码。只有在存在会话并且客户端禁用了 cookies 时,它才会将 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));

创建一个过滤器,将其映射到/*,并在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 显式设置编码方式。阅读链接。 - BalusC
谢谢您关注我的问题。我尝试理解过滤器的工作原理并遵循您的建议,但是我遇到了一些异常情况。明天我会继续工作,并带来一些反馈。 - CdB
1
@Mr_ 在使用查询字符串时,如果涉及到特殊字符,就必须使用 URLEncoder。 - BalusC
谢谢 - 我整天都在看它 :) - Mr_and_Mrs_D
1
@Mr_ 不用谢。String.format 只是为了方便起见。我发现它比 "..." + ... + "..." + ... + "..." 更易读。这对于功能要求并非强制性的。 - BalusC
显示剩余3条评论

1
使用java.net.URLEncoder在将参数添加到URL之前对每个参数进行编码。这样想:如果您的姓名包含"&",那么如何知道这不是参数分隔符?


感谢回复sstendal。我已经尝试过这个方法,但结果仍然一样。也许需要更多的东西。 - CdB

0

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

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


0

以下方案如何?

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

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

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


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