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
也解码)
我遇到了一些问题,包括 <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
也解码)