JavaWeb中post提交乱码之编码拦截器Filter
最近做项目比较忙,一直没有更新新的知识,有好多好的代码没给大家分享出来,后期我会抽空整理出来的
这两天遇到一个项目编码问题,搞了两天了也没解决。问题是这样的:
项目是gbk的编码(我知道看到这里要被吐槽,但是项目编码是我在接受之前都写好的,我也不知道是谁用gbk来写的,呵呵哒。。。),之前一直在Windows的服务器上部署着,Linux服务器上也部署过一套,系统编码是gbk的,没出过什么问题。前天有个新的客户使用是Linux服务器,系统编码却是utf-8的,因为服务器上还有其他的项目(utf-8)的,所以没办法为了我这个项目而去改系统编码,没想到启动项目后post过来的参数都成了乱码,get方式的却没问题。
我看了下之前的编码过滤器是这样写的,首先获取request的parameter,如果是post方式则循环取值转码,最后是没问题的,但是在Linux上却莫名其妙的不行。最后百度了一下好多都是要setCharacterEncoding,于是乎我就又设置了编码格式,依旧不行,通过打印信息直到最后我才意识到,原来我之前通过遍历取值转码已经显示正常了,接着我又setCharacterEncoding就又不正常了,所以我干脆直接就setCharacterEncoding不做循环取值转码操作,这时候重新更新部署后,奇迹般的好了,get方式post方式一切正常。
说了这么多废话,可能有点乱,这里直接上代码吧:
1 package com.blue.app.common; 2 3 import java.io.IOException; 4 import java.util.Iterator; 5 import java.util.Map; 6 7 import javax.servlet.Filter; 8 import javax.servlet.FilterChain; 9 import javax.servlet.FilterConfig; 10 import javax.servlet.ServletException; 11 import javax.servlet.ServletRequest; 12 import javax.servlet.ServletResponse; 13 import javax.servlet.http.HttpServletRequest; 14 import javax.servlet.http.HttpServletResponse; 15 16 /** 17 * 字符编码过滤器 18 * @author 爱茹一婉年 19 * 20 */ 21 public class CommonFilter implements Filter { 22 23 /** 保存用户指定编码 */ 24 protected String encoding = null; 25 26 /** 27 * 初始化过滤器方法,由系统创建Filter时自动调用 把web.xml中用户指定的编码保存在本类的属性中 28 */ 29 public void init(FilterConfig filterConfig) throws ServletException { 30 this.encoding = filterConfig.getInitParameter("encoding"); 31 } 32 33 /** 34 * 执行过滤功能 将参数信息按指定的编码进行转换 35 * 针对post进行编码处理,get方式略过 36 */ 37 @SuppressWarnings("unchecked") 38 public void doFilter(ServletRequest arg0, ServletResponse arg1, 39 FilterChain chain) throws IOException, ServletException { 40 41 HttpServletRequest request = (HttpServletRequest) arg0; 42 HttpServletResponse response = (HttpServletResponse) arg1; 43 44 if ("POST".equals(request.getMethod())) { 45 //参数转换,因为我们已经它肯定是Http协议的请求。 46 request.setCharacterEncoding(this.encoding); 47 response.setCharacterEncoding(this.encoding); 48 response.setContentType("text/html;charset=" + this.encoding); 49 //------------注意这里上下的顺序不能颠倒------------- 50 //以下测试输出用 51 Map parameterMap = request.getParameterMap(); 52 if (!parameterMap.isEmpty()) { 53 Iterator it = parameterMap.keySet().iterator(); 54 String value[] = null; 55 while (it.hasNext()) { 56 value = (String[]) parameterMap.get(it.next()); 57 for (int i = 0; i < value.length; i++) { 58 System.out.println("编码过滤后的值----" + value[i]); 59 //System.out.println(this.encoding+"转换结果--------"+new String(value[i].getBytes("ISO-8859-1"),this.encoding)); 60 } 61 } 62 } 63 } 64 chain.doFilter(arg0, arg1); 65 } 66 67 /** 68 * 销毁方法,在系统销毁Filter之前由系统自动调用 69 */ 70 public void destroy() { 71 this.encoding = null; 72 } 73 74 }
过滤器的代码已经写完了,下边是web.xml相关的配置
1 <!-- 编码过滤器 --> 2 <filter> 3 <filter-name>CommonFilter</filter-name> 4 <filter-class>com.blue.app.common.CommonFilter</filter-class> 5 <init-param> 6 <param-name>encoding</param-name> 7 <param-value>gbk</param-value> 8 </init-param> 9 </filter> 10 <filter-mapping> 11 <filter-name>CommonFilter</filter-name> 12 <url-pattern>/*</url-pattern> 13 </filter-mapping>
==========================================路漫漫其修远兮========================================== ====================== 知识改变生活 ====================== ====================== 技术改变命运 ====================== ====================== 我是一名普通的程序员 ====================== ====================== 希望通过自己的努力来使自己人生更加绚烂多彩 ====================== ==========================================吾将上下而求索==========================================