java Struts2 s:带有特殊字符的url参数未正确解码
我遇到了一些问题,包括<s:url/>
{
在<s:form/>
中的参数,无论是隐藏字段还是显式字段,都表现得很好,尽管有些字段可能具有特殊字符,但当我尝试将任何包含特殊字符(在本例中为“é”)的参数附加到struts2
URL并用它触发操作时,麻烦就来了
这是<s:url/>
:
<s:url var="urlRegular" action="fetchUserServices" escapeAmp="false">
<s:param name="username" value="%{username}" />
<s:param name="type" value="%{type}"/>
</s:url>
使用Eclipse进行调试时,每当调用方法fetchUserServices
时,参数username
(应该是'cInglés')就会显示为存储为'cInglÃs',因此我猜它没有从HTTP
请求中提交的UTF-8
正确解码
在HTTP
请求中,我可以看到参数username
是这样编码和发送的:
myPath/fetchUserServices.action?username=cIngl%C3%A9s&type=1
因此,在我看来,它已成功地从视图发送到控制器
我也尝试过这样指定username
参数,但没有成功:
<s:url var="urlRegular" action="fetchUserServices" escapeAmp="false">
<s:param name="username" >
<s:property value="%{username}" />
</s:param>
<s:param name="type" value="%{type}"/>
</s:url>
这只是改变了它的行为方式,如果我使用这种表示法,参数现在在url上编码如下(XHR
请求):
myPath/fetchUserServices.action?username=%5BcIngl%26eacute%3Bs%5D&type=1
我的fetchUserServices
方法是这样接收的:cIngl&;\伊库特;s(没有“\”,我不得不使用它,因为这里使用的标记语言将其解码为cInglés)
现在我有点不知所措了,我的所有页面都指定了UTF-8
编码,当带有特殊字符的参数进入<s:form />
标记时,它们就不是问题了
如何修复此问题并在fetchUserServices
方法上解码参数
问题更新:尝试了此解决方案here,建议使用Spring character encoding filter
,但也不起作用
# 1 楼答案
最后我设法让它工作起来。我所要做的就是在8080端口的连接器中指定URI编码,我的tomcat在这里处理请求
我正在使用的版本是
tomcat7
,我所要做的就是添加URIEncoding = "UTF-8"
,所以现在看起来是这样的:此外,还可以指定字符编码过滤器,例如中的第一个过滤器:
Spring
提供的过滤器。您所要做的就是将其添加为^{这对我来说不是强制性的,因为只说明URI编码的工作方式,不需要包含过滤器,但我已经在网上读到它可以帮助我
关于缺乏理解为什么它可以使用
POST
请求而不使用GET
请求,我了解到POST
请求自己指定字符编码,而其他请求则不指定字符编码。引自tomcat apache wiki:最后,还有very elaborated answer here解决了这个问题,如果您需要更高级的帮助,它可以提供帮助(它涵盖了使用
mysql
和允许UTF-8
解码的需要)