Struts2:url params,特殊字符无法正确解码

时间:2015-10-01 14:07:58

标签: java struts2 character-encoding url-encoding

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

<s:form/>内的参数,无论是隐藏字段还是显式字段都表现得很好,尽管有些字符可以有特殊字符,但是当我尝试附加包含特殊字符的任何参数时会遇到麻烦(在本例中为'é ')到struts2网址并用它触发操作。

这是<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',因此我认为来自UTF-8请求的HTTP未正确解码。

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>

这只会改变它的行为方式,如果我使用那种表示法,那么param现在就像这样(XHR请求)在url上编码:

myPath/fetchUserServices.action?username=%5BcIngl%26eacute%3Bs%5D&type=1

我的fetchUserServices方法以这种方式接收它: cIngl&amp; \ eacute; s (没有'\',我必须使用它,因为此处使用的降价语言解码它作为cInglés)

此时我有点迷失,我的所有页面都指定了UTF-8编码,并且当他们进入<s:form />标记时,带有特殊字符的参数不是问题。

如何修复此问题并在我的fetchUserServices方法中解码参数?

问题更新:尝试使用Spring character encoding filter建议使用class DELL { public: DELL() { std::cout << "DELL constructor called\n"; } ~DELL() { std::cout << "DELL destructor called\n"; } }; ,但它也不起作用。

1 个答案:

答案 0 :(得分:1)

最后,我设法让它发挥作用。我所要做的就是在端口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

  

请求或响应的默认字符编码是什么   体吗

     

如果未指定字符编码,则为Servlet规范   要求使用ISO-8859-1的编码。人物   HTTP消息(请求或响应)的主体的编码是   在Content-Type标头字段中指定。这样一个例子   标题是Content-Type:text / html; charset = ISO-8859-1明确地说   说明正在使用默认值(ISO-8859-1)。

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