3

我正在使用 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");
%>

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

提前致谢 :)

4

4 回答 4

8

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

URLEncoder#encode()在编写 URL的过程中,您需要自己对请求参数进行编码。

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>

也可以看看:

于 2011-02-23T21:23:41.037 回答
1

Use the java.net.URLEncoder to encode each parameter before adding them to the url. Think about it this way: if your name contained a "&", how would you know that this was not a parameter delimiter?

于 2011-02-23T21:27:09.623 回答
0

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

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

于 2011-02-23T21:23:11.710 回答
0

那么下面的呢?

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

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

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

于 2011-02-23T21:23:26.733 回答