有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

<s:form/>中的参数,无论是隐藏字段还是显式字段,都表现得很好,尽管有些字段可能具有特殊字符,但当我尝试将任何包含特殊字符(在本例中为“é”)的参数附加到struts2URL并用它触发操作时,麻烦就来了

这是<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) 个答案

  1. # 1 楼答案

    最后我设法让它工作起来。我所要做的就是在8080端口的连接器中指定URI编码,我的tomcat在这里处理请求

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

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

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

     <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解码的需要)