我正在使用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 =ΕΡΕΥΝΑΣ我得到名字=¡¥。 如何解决此编码问题(将其设置为UTF-8)? 是不是encodeRedirectURL()做这个工作?我应该在某个时候使用encodeURL()吗?我尝试了最后一个,但问题仍然存在。
提前致谢:)
答案 0 :(得分:7)
HttpServletResponse#encodeRedirectURL()
不对网址进行网址编码。只要有会话且客户端禁用了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>
答案 1 :(得分:1)
使用java.net.URLEncoder对每个参数进行编码,然后再将它们添加到url中。这样考虑一下:如果你的名字包含“&amp;”,你怎么知道这不是参数分隔符?
答案 2 :(得分:0)
在将每个请求参数放入查询字符串之前,应该使用URLEncoder.encode()
对每个请求参数进行编码。
encodeRedirectURL
方法仅用于在必要时将会话ID包含在URL中(如果浏览器不支持cookie,则重写URL)
答案 3 :(得分:0)
以下情况怎么样?
这样可以节省将浏览器从第一个servlet重定向到JSP派生的servlet,并完全避免整个参数编码问题。
还要确保JSP页面指令将内容编码设置为UTF-8。