非常烦恼的struts2 URL中文乱码

这又是一个花费我差不多成十小时的问题——struts2 URL乱码!
我已经统一以utf-8编码了,包括jsp、action、数据库、tomcat的connector的URIEncoding、myeclipse和StrutsPrepareFilter的doFilter方法中都设置了编码格式为utf-8。
我用的是struts2.1.6,在网上搜索一下,得知到struts2.1.6的StrutsPrepareFilter有一个编码bug。对于这个bug,可以用spring2中的一个CharacterEncodingFilter来解决。具体做法是在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>
需要注意的是:这个filter一定要在struts2的filter之前配置。但我用的是重写StrutsPrepareFilter的doFilter方法。这些做法好像对URL传过来的参数无效。
如果是struts2.1.3以下的可以在struts.properties文件中设置一下编码属性,具体做法是:
Struts.i18n.encoding=utf-8
Struts.local=xxx
……
以上的方法都用过了,但就是解决不了“乱码”这个怪兽。
最后,上天还是不负有心人。我用的浏览器IE8(兼容性视图)和firefox(3.5.6),当设置tomcat的URIEncoding为gbk时IE8在URL上传过来的中文不会乱码,而firefox在URL传过来的中文却是乱码。当设置tomcat的URIEncoding为utf-8时,firefox在URL传过来的中文正常,而IE8在URL上传过来的中文却又乱码了。可以猜想到IE8和firefox3.5.6在将URL的参数传到服务时先以某种格式编码,但各自的编码格式不相同!
这个时候,没别的办法了,只好用最原始的方法:先将要以URL方式传递的参数以和服务器的编码格式编码再传送,但就不用再在服务端解码了。也就是先将tomcat的URIEncoding设为utf-8,再将中文参数编成utf-8格式。我的做法是:
<a href="cAction/interRoom.action?roomName=<s:property value='@java.net.URLEncoder@encode(roomName,"utf-8")'/>" target="_blank"><s:property value="roomName"/></a>
注意在struts2.1.3以上的要开启静态方法使用功能。

你可能感兴趣的:(tomcat,struts,MyEclipse,浏览器,firefox)