Action间使用redirectAction时中文出乱码

问题:项目采用注解方式,在使用redirectAction,通过params传递参数时,接收action得到的中文参数直接获取得到的是乱码。

这是网上搜索到的一篇文章的一部分:(来源网站 )

我觉得问题的关键在于不恰当的使用了redirect!  
原因如下:  
redirect就是资源重定向,一般用于跳转到其它网站访问所用。如果访问的是内部网站资源,使用redirect就是一种下策,因为redirect无法将前一个请求的参数共享给下一个网站使用,比如request中的参数。当然可以用地址参数来传递,那么问题就来了,也是本贴的主题,就是中文参数乱码问题。因为资源重定向跳转要经过客户端浏览器的重新发送(可以试验一下,重定向发送的请求在浏览器地址栏里最终显示的是重定向后的请求地址,而chain则是第一个action的请求地址),其实这也就是servlet中sendRedirect和forward(include)的区别。中文乱码的原因也就在这里,因为经过浏览器跳转后编码就不受struts2管理了。  
注:为什么经过浏览器跳转编码就变了原因很复杂,因为本贴的跳转实际还是受原网站控制的,浏览器输出时不论本地默认编码为何已经强制被改为UTF-8,按理说跳转后浏览器重新申请时应该还是UTF-8编码,但不知为什么却变成了ISO-8859-1,这里期待高人给解释一下。  
多说一点,返回类型中还有一个redirectAction,书上的解释是重定向到一个新的action,请求参数全部丢失,action处理结果也全部丢失。按这个解释,redirectAction和chain的区别就是一个跳转时丢失参数,一个不丢失。这里就让人费解了,因为chain完全可以替代redirectAction嘛。我觉得这个redirectAction的作用是不是适用于不用传参或传递简单参数的情况,这样便于系统将前面action的资源尽快释放,做到资源充分利用?这里高手给解释一下。redirectAction会不会产生中文传参乱码我没有试验,不过楼上有朋友说没有问题,那就算可以吧。  
最后总结一下:  
1、凡是网站内部资源访问的就尽量不要用redirect,而是用chain和redirectAction,至少这样可以避免中文传参乱码。  
2、chain传参方法我就不说了,就是request、parameters,但能不用session就不要用session了。  
3、使用redirect传参时,如果带中文目前好像就只有用本贴开始所说的解决方案了。有些朋友所说的过滤器并不是和本贴说的一个问题,而是指struts2框架以前浏览器提交乱码问题。  

这是文中提到的另外一部分内容的解决办法:通过增加配置encode参数:
<
action name="remove" class="cn.Xxooacion" method="remove"> <result name="success" type="redirect"> <param name="location">list.action?msg=${msg}</param> <param name="encode">true</param> </result> </action>
方法2:
<
result name="remove" type="redirect"> <param name="location">list.action</param> <param name="parameter">${parameter}</param> </result>
方法3:
<
result type="chain"> <param name="actionName">list.action?msg=${msg}</param> </result>

因为对于chain方式在本项目不适用,所以没做测试。

而项目本身通过注解实现的就是方法2的传参方式,但实际上得到的仍然是乱码。

测试在注解中增加encode,true 得到的是编码后的参数。不能直接使用。

最后只能使用项目传递反馈消息的解决办法:

URLDecoder.decode(new String(paramVariable
     .getBytes("ISO8859-1"), "UTF-8"), "UTF-8")

通过重新编码解码的方式获取对应的参数值。


 2013.6.18 乱码后记:

项目部署到另外一个机器上后,继续出现乱码,查阅网上的资料得到这样一篇详细的关于Java出现中文乱码的整理后的文章。写的很详细条理也很清晰。

http://wenku.baidu.com/view/34cc347501f69e31433294d5.html   是文库的地址。

从这篇文章中找到了导致 重定向乱码出现的原因:

tomcat下server.xml 的默认配置编码方式是ISO-8859-1,我本机使用的是默认配置。所以在重定向后需要用URLDecoder重新解码得到原来的字符串。但同时由于这个配置导致另外一台测试用的机器出现乱码,因为这台测试机在server.xml中进行了编码配置,设置为了utf-8。所以此时再在后台用ISO8559-1编码来获取Byte时就出现了编码不一致的情况。导致出现乱码。

修改server.xml,URIEncoding="UTF-8"

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

本机测试:果然在增加该配置之后,由于Action中进行了强制转码并且采用ISO-8859-1进行解码,页面得到的就是乱码了。删掉URIEncoding配置之后就OK了。

原文地址:https://www.cnblogs.com/justbeginning/p/3113843.html