java 拦截post请求_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 packagecom.blue.app.common;2

3 importjava.io.IOException;4 importjava.util.Iterator;5 importjava.util.Map;6

7 importjavax.servlet.Filter;8 importjavax.servlet.FilterChain;9 importjavax.servlet.FilterConfig;10 importjavax.servlet.ServletException;11 importjavax.servlet.ServletRequest;12 importjavax.servlet.ServletResponse;13 importjavax.servlet.http.HttpServletRequest;14 importjavax.servlet.http.HttpServletResponse;15

16 /**

17 * 字符编码过滤器18 *@author爱茹一婉年19 *20 */

21 public class CommonFilter implementsFilter {22

23 /**保存用户指定编码*/

24 protected String encoding = null;25

26 /**

27 * 初始化过滤器方法,由系统创建Filter时自动调用 把web.xml中用户指定的编码保存在本类的属性中28 */

29 public void init(FilterConfig filterConfig) throwsServletException {30 this.encoding = filterConfig.getInitParameter("encoding");31 }32

33 /**

34 * 执行过滤功能 将参数信息按指定的编码进行转换35 * 针对post进行编码处理,get方式略过36 */

37 @SuppressWarnings("unchecked")38 public voiddoFilter(ServletRequest arg0, ServletResponse arg1,39 FilterChain chain) throwsIOException, 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 voiddestroy() {71 this.encoding = null;72 }73

74 }

过滤器的代码已经写完了,下边是web.xml相关的配置

1

2

3 CommonFilter

4 com.blue.app.common.CommonFilter

5

6 encoding

7 gbk

8

9

10

11 CommonFilter

12 /*

13

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值