request.getParameter() 在 java servlet 中无法正确显示字符编码
Posted
技术标签:
【中文标题】request.getParameter() 在 java servlet 中无法正确显示字符编码【英文标题】:request.getParameter() does not display properly character encoding in java servlet 【发布时间】:2013-10-05 20:12:57 【问题描述】:Java servlet 文件中的 UTF-8 存在一些问题。当我在 URL 中获取参数值时,我对 UTF-8 字符有一些问题。无法正确显示日文字符。
jsp头已经有
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
我将连接器中的 URIEncoding 设置添加到 server.xml 中的 UTF-8。
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
我在jsp中写了如下代码
<s:textfield key="txt_name" name="txt_name" id="txt_name"
maxlength="64"></s:textfield>
<a href="javascript:showModalWindow('PopUpFile!init.action?<%=Common.PASSWORD%>=<%=Common.encript(ID, Code)%>','',940,650);">
<s:property value="PopUp Link" />
</a>
<script>
function showModalWindow(x_URL, x_ARG, x_WIDTH, x_HEIGHT)
var x_OPT = "dialogHeight: " + x_HEIGHT + "px; " + "dialogWidth: "
+ x_WIDTH + "px; "
+ "edge: Raised; center: Yes; resizable: Yes; status: Yes;";
x_URL += "&name="+document.getElementById("txt_name").value;
var retValue = window.showModalDialog(x_URL, x_ARG, x_OPT);
if (retValue != null)
document.forms.frm.action = "ParentFile!getUser.action";
document.forms.frm.submit();
</script>
然后,我在java servlet中编写了如下代码。
if(g_request.getParameter("name") != null)
g_session.setAttribute(NAME, g_request.getParameter("name"));
我还在 java servlet 中使用request.setCharacterEncoding()
方法进行了测试,但它并没有真正起作用。
虽然我尝试了很多方法来回答其他人在***中与servlet中字符编码相关的问题,但我无法解决我的问题。
如何正确显示字符编码?提前致谢。
【问题讨论】:
How do I correctly decode unicode parameters passed to a servlet的可能重复 【参考方案1】:您是否使用System.out.println
测试输出?如果是这样,可能是它没有配置为 UTF-8。
看到这个:Can not send special characters (UTF-8) from JSP to Servlet: question marks displayed
还要确保在读取参数之前运行request.setCharacterEncoding("UTF-8")
。
【讨论】:
已经配置为UTF-8,现在我用SOP测试,显示为“���j�b�gC1”。并且还尝试了request.setCharacterEncoding("UTF-8")
,但直到没有运气。 :(
request.setCharacterEncoding("UTF-8") 解决我的问题,谢谢。【参考方案2】:
大多数服务器,包括 Apache Tomcat 服务器,默认配置为使用ISO-8859-1
进行参数编码。我认为除非您拥有私有专用服务器实例,否则您不会更改此设置。因此,程序员的技术是手动编码/解码这些参数。因为您使用的是javascript,所以有encodeURI()
或encodeURIComponent()
内置函数。见How to encode a URL in JavaScript。代码应该改变
x_URL += "&name="+encodeURI(document.getElementById("txt_name").value);
在 Java 中使用URLDecoder
将参数解码回来。
java.net.URLDecoder.decode(((String[])request.getParameterMap().get("name"))[0], "UTF-8"));
注意,如果您使用的是 Struts2 dispatcher
结果类型,那么您不需要解码查询字符串中的参数。这些参数通过UrlHelper
解析。
但是,我不记得我什么时候解码这些参数是在 Struts2 中自动解码的。
作为一项规则,您应该知道,如果您在 URL 中传递参数,它们应该是 URL 编码的。如果您提交表单,则无需这样做,因为表单是x-www-form-urlencoded
,请参阅17.13.4 Form content types。
【讨论】:
谢谢@Roman C,你又救了我的命! :) 我只是 struts 2 和 javascript 的新手。当你回答我的问题时,你总是向我解释细节。所以,我从你那里得到了很多经验。非常感谢!!!【参考方案3】:如果您使用 Spring,我有类似的错误并使用 Servlet 过滤器解决它,只需将此定义添加到 web.xml
<!-- CharacterEncodingFilter / UTF-8 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果您不使用 Spring,请编写一个 servlet 过滤器,例如:
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException
//Set character encoding as UTF-8
request.setCharacterEncoding("UTF-8");
filterChain.doFilter(request, response);
【讨论】:
重要:确保此过滤器在任何其他过滤器之前先执行,否则它将不起作用 @doom777 我没有遇到这样的问题,我可能会在 encodingFilter 之前测试它以定义一个新的过滤器,下面它工作正常但 web.xml 现在只有一个过滤器。 github.com/muzir/azorka.web/blob/master/src/main/webapp/WEB-INF/… 好吧,基本上,如果在设置 CharEncoding 之前访问参数,你就迷路了。您必须确保在 CharacterEncodingFilter 之前没有代码访问请求参数【参考方案4】:我想将评论从 f.khantsis 升级为答案,因为事实证明它对我来说很重要。
重要提示:确保先执行此过滤器,然后再执行其他过滤器,否则将无法正常工作。
我们的 servlet 过滤器中有一个正确的编码设置:
request.setCharacterEncoding("UTF-8");
但是当我在request.getParameter
中设置断点时,它显示我们在设置编码之前正在读取参数。它发生在另一个过滤器(csrf)中。此时编码被冻结并且进一步设置它是无效的。这可能取决于服务器,但在我们的案例(Websphere)中就是这样。
【讨论】:
以上是关于request.getParameter() 在 java servlet 中无法正确显示字符编码的主要内容,如果未能解决你的问题,请参考以下文章
request.getParameter() 和request.getAttribute() 区别
jsp中request.getParameter和request.getAttribute之间的区别
request.getParameter() request.getInputStream()和request.getReader()三者的区别
request.getParameter()request.getInputStream()和request.getReader()