最近在在项目中要开发一个发布系统,用来发布新闻等。页面上用了fck编辑器,
在页面上提交发布的内容,先前是默认的get提交,一直没有出现乱码,因为内容比较多,必须采用post提交,
但是一直出现了乱码。我的页面设置的全是utf-8
而且在BaseAction 里面
/** * 获得客户端参数值,返回值已经经过了转码。 */ protected String getParam(String name){ String tmp = getRequest().getParameter(name); if(log.isDebugEnabled()){ log.debug("request.getParamter: " + name + " = " + tmp); } if(tmp==null || "".equals(tmp)){ return null; }else{ try { String result = URLDecoder.decode(tmp, GlobalConstant.SYSTEM_ENCODING); return result; } catch (UnsupportedEncodingException e) { log.error("getParam()", e); return tmp; } } }
都做了处理,定义的那个常量也是utf-8. 在网上查了查乱码的几种解决方案,
决定像先前的那样 弄个过滤器,于是采用了
spring 内置的过滤器 在web.xml 添加如下代码
<filter> <filter-name>springEncodingFilter</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>springEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
貌似还是不很凑效,乱码一直存在。继续找乱码的原理,get 和 post 的传递方式的不一样,等等 于是把
更改 D:\Tomcat\conf\server.xml,指定浏览器的编码格式为“简体中文”:
方法是找到 server.xml 中的
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='utf-8' />
改了,但是 还没有效果,
无奈只好自己写了个过滤器,还是不行,,把网上各位大侠的解决方法都用了遍,就感觉纳闷了,一个小小的乱码问题竟然困扰了好几天,在action里面 进行 设置,
getRequest().setCharacterEncoding("utf-8");
还是不行,简直疯掉了,难道真的是人品问题,开始怀疑自己了。
最终 找的了 百度hi 上一牛人的解决方法
struts2.1.6版本中存在一个Bug,即接收到的中文请求参数为乱码(以post方式提交),原因是struts2.1.6在获取并使用了请求参数后才调用 HttpServletRequest的setCharacterEncoding()方法进行编码设置,导致应用使用的就是乱码请求参数。这个bug在struts2.1.8中已经被解决,如果你使用的是struts2.1.6,要解决这个问题,你可以这样做:新建一个Filter,把这个Filter放置在Struts2的Filter之前,然后在doFilter()方法里添加以下代码
public void doFilter(...){
HttpServletRequest req = (HttpServletRequest) request;
req.setCharacterEncoding("UTF-8");//应根据你使用的编码替换UTF-8
filterchain.doFilter(request, response);
}
哎 仔细一看 ,我就是用的这个,我把web.xml
<filter> <filter-name>springEncodingFilter</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>springEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
<filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern>
放在 struts2 的过滤器前面 (先前的字符过滤器是放在Struts2的Filter之后的),web.xml 是按照顺序加载的,所以就出现了问题。
,一切 ok, 哎 好烦人的这个乱码问题终于解决掉了。。