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>?
轉載于:https://www.cnblogs.com/wanying521/p/5545985.html
總結
以上是生活随笔為你收集整理的JavaWeb中post提交乱码之编码拦截器Filter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinForm实现简单的拖拽文件到出题的
- 下一篇: Android Studio或者Ecli