Struts2 s:url 具有特殊字符的参数未正确解码

Struts2 s:url params with special characters not getting decoded properly

我遇到了一些问题,包括 <s:url/> struts2 标签中带有特殊字符的参数。

<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&\eacute;s (没有'\',我不得不使用它因为这里使用的降价语言将其解码为 cInglés).

在这一点上我有点迷茫,我的所有页面都指定了 UTF-8 编码,当它们进入 <s:form /> 标签时,带有特殊字符的参数不是问题。

如何解决这个问题并在我的 fetchUserServices 方法中解码我的参数?


问题更新:尝试了这个解决方案here,它建议使用Spring character encoding filter,但它也没有用。

我终于成功了。我所要做的就是在端口 8080 的连接器中指定 URI 编码,我的 tomcat 在这里处理请求。

我使用的版本是tomcat7,我所要做的就是添加URIEncoding = "UTF-8"所以现在它看起来像这样:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

此外,还可以指定字符编码过滤器,例如Spring提供的过滤器。您所要做的就是将此作为 第一个 过滤器添加到您的 web.xml:

 <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>

这对我来说不是强制性的,因为 说明了 URI 编码,不需要也包括过滤器,但我已经在网上看到它可以帮忙。


关于缺乏理解 为什么它可以使用 POST 请求而不是 GET 请求,我了解到 POST 请求自己指定字符编码,其他则不指定。引自 tomcat apache wiki:

What is the default character encoding of the request or response body?

If a character encoding is not specified, the Servlet specification requires that an encoding of ISO-8859-1 is used. The character encoding for the body of an HTTP message (request or response) is specified in the Content-Type header field. An example of such a header is Content-Type: text/html; charset=ISO-8859-1 which explicitly states that the default (ISO-8859-1) is being used.

最后,very elaborated answer here 解决了这个问题,如果您需要更高级的帮助,它可以提供帮助(它涵盖了使用 mysql 和需要允许 UTF-8 也解码)