zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    面试官:能解释一下javascript中bind、apply和call这三个函数的用法吗
    接口测试基础004----常见的post请求中的参数形式
    JMeter基础017----JMeter自带录制功能使用
    JMeter基础016----JMeter文件上传与下载
    JMeter基础018----生成HTML测试报告
    JMeter基础019----JMeter接口功能、性能、自动化测试
    接口测试基础002----HTTP请求、RESTful风格
    Jmeter报错001--- ERROR o.a.j.JMeter: Uncaught exception in thread Thread[AWT-EventQueue-0,6,main] java.lang.InternalError: Could not bind shell folder to interface
    Jmeter基础014----组件总结、FTP(了解)及其他不重要组件
    Jmeter基础013----图形监视器之监控服务器资源
  • 原文地址:https://www.cnblogs.com/wanying521/p/5545985.html
Copyright © 2011-2022 走看看