浅谈java web开发中的乱码问题的解决

简介:

直接上在工作中遇到的问题吧:

在springmvc的项目中 前台表单通过get请求发送的中文在后台接收后出现乱码

于是我配置了一个spring的过滤器 

1
org.springframework.web.filter.CharacterEncodingFilter

但是仅仅处理了post请求的中文乱码问题,网上说有一种简单的方法就是修改tomcat的server.xml文件,但是这个方法也太部靠谱了吧,还是另想他发吧!

于是我就着手写一个Filter去处理乱码问题 通过包装


1
javax.servlet.http.HttpServletRequestWrapper

类 重写request中获取参数的方法并对参数进行重编码来解决问题,应该没问题吧,可是搞了半天竟然还没起作用,我在Filtter中

1
chain.doFilter(...)

前后各打印请求参数,显示转码成功了呀, 怎么回事?。。。

经过一时思考,原来是处理逻辑有问题,在程序中没有做是否转过码的判断,导致有可能在springmvc的自动装载请求参数的过程中可能把我已经转过码的参数再次转码 这样肯定不行啦!!

下面把代码贴出,注意的地方标红吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
  * 对请求和响应的数据进行编码
 
  * @author aracwong
 
  */
public  class  CharacterEncodingFilter  implements  Filter {
 
     public  static  final  String PARAM_ENCODING_NAME =  "encoding" ;
     public  static  final  String UTF_8 =  "UTF-8" ;
     public  static  final  String ISO_8859_1 =  "ISO-8859-1" ;
 
     private  String encoding = CharacterEncodingFilter.UTF_8;
     
     
 
     public  void  doFilter(ServletRequest request, ServletResponse response,
             FilterChain chain)  throws  IOException, ServletException {
         HttpServletRequest requ = (HttpServletRequest) request;
         HttpServletResponse resp = (HttpServletResponse) response;
         request.setCharacterEncoding(CharacterEncodingFilter.UTF_8);
         response.setCharacterEncoding(CharacterEncodingFilter.UTF_8);
         // 使用包装类
         MyHttpServletRequest myrequest =  new  MyHttpServletRequest(requ);
         chain.doFilter(myrequest, resp);
     }
 
     public  void  init(FilterConfig filterConfig)  throws  ServletException {
         String _encoding = filterConfig
                 .getInitParameter(CharacterEncodingFilter.PARAM_ENCODING_NAME);
         if  (StringUtils.isNotBlank(_encoding)) {
             encoding = _encoding;
         }
     }
 
     private  class  MyHttpServletRequest  extends  HttpServletRequestWrapper {
         private  HttpServletRequest request;
         
         private  boolean  flag =  false ;
 
         public  MyHttpServletRequest(HttpServletRequest request) {
             super (request);
             this .request = request;
         }
 
         @Override
         public  String getParameter(String name) {
             Map<String, String[]> map = getParameterMap();
             if  (map !=  null ) {
                 String[] values = map.get(name);
                 if  (values !=  null ) {
                     return  values[ 0 ];
                 }
             }
             return  null ;
         }
 
         @Override
         public  String[] getParameterValues(String name) {
             Map<String, String[]> map = getParameterMap();
             if  (map !=  null ) {
                 String[] values = map.get(name);
                 if  (values !=  null ) {
                     return  values;
                 }
             }
             return  null ;
         }
 
         @Override
         public  Map<String, String[]> getParameterMap() {
             if  ( "post" .equalsIgnoreCase(request.getMethod())) {
                 // post方式提交
                 try  {
                     request.setCharacterEncoding(encoding);
                 catch  (UnsupportedEncodingException e) {
                     e.printStackTrace();
                 }
                 return  request.getParameterMap();
             else  {
                 // get方式提交
                 Map<String, String[]> paramMap = request.getParameterMap();
                 if  (!flag) {
                     for  (Map.Entry<String, String[]> me : paramMap.entrySet()) {
                         String[] values = me.getValue();
                         
                         for  ( int  i =  0 ; i < values.length; i++) {
                             try  {
                                 values[i] =  new  String(
                                         values[i]
                                                 .getBytes(CharacterEncodingFilter.ISO_8859_1),
                                                 encoding);
                             catch  (UnsupportedEncodingException e) {
                                 e.printStackTrace();
                             }
                         }
                         
                     }
                     flag =  true ;
                 }
                 return  paramMap;
             }
         }
     }
 
     public  void  destroy() {
 
     }
}

一下这个代码非常有必要:如果这个请求对象已经被转过码,下次调用取请求参数的时候做个判断,就不再转码了,不然转过码的UTF-8数据 再以ISO8859-1取字节 在转换成UTF-8肯定会报错咯,真是个宝贵的错误经验

1
private  boolean  flag =  false ;


      本文转自arac 51CTO博客,原文链接:http://blog.51cto.com/skyarac/1717599,如需转载请自行联系
原作者









相关文章
|
4天前
|
前端开发 JavaScript Java
计算机Java项目|基于web的铁路订票管理系统
计算机Java项目|基于web的铁路订票管理系统
|
4天前
|
前端开发 JavaScript Java
计算机Java项目|基于Web的足球青训俱乐部管理后台系统的设计与开发
计算机Java项目|基于Web的足球青训俱乐部管理后台系统的设计与开发
|
4天前
|
前端开发 JavaScript Java
计算机Java项目|热门网游推荐网站的设计与开发
计算机Java项目|热门网游推荐网站的设计与开发
计算机Java项目|热门网游推荐网站的设计与开发
|
6天前
|
传感器 小程序 搜索推荐
(源码)java开发的一套(智慧校园系统源码、电子班牌、原生小程序开发)多端展示:web端、saas端、家长端、教师端
通过电子班牌设备和智慧校园数据平台的统一管理,在电子班牌上,班牌展示、学生上课刷卡考勤、考勤状况汇总展示,课表展示,考场管理,请假管理,成绩查询,考试优秀标兵展示、校园通知展示,班级文化各片展示等多种化展示。
31 0
(源码)java开发的一套(智慧校园系统源码、电子班牌、原生小程序开发)多端展示:web端、saas端、家长端、教师端
|
4天前
|
前端开发 JavaScript Java
计算机Java项目|基于Web的电子产品销售系统设计与实现
计算机Java项目|基于Web的电子产品销售系统设计与实现
|
4天前
|
前端开发 JavaScript Java
计算机java项目|基于web的多媒体素材管理系统
计算机java项目|基于web的多媒体素材管理系统
|
5天前
|
Dart 前端开发 JavaScript
Flutter for Web:跨平台移动与Web开发的新篇章
Flutter for Web是Google的开源UI工具包Flutter的延伸,用于构建高性能、高保真的跨平台应用,包括Web。它基于Dart语言和Flutter的核心框架,利用Skia渲染引擎通过WebAssembly在Web上运行。开发流程包括安装SDK、创建项目、编写Dart代码和部署。性能优化涉及减少渲染开销、代码压缩等。与传统Web框架相比,Flutter for Web在开发效率和性能上有优势,但兼容性和生态系统尚待完善。
13 0
|
5天前
|
SQL Java 数据库连接
JavaWeb Mapper代理开发
JavaWeb Mapper代理开发
|
5天前
|
监控 安全 自动驾驶
基于java+单体服务 + 硬件(UWB定位基站、卡牌)技术架构开发的UWB室内定位系统源码 UWB定位技术 超宽带定位 高精度定位系统源码
基于java+单体服务 + 硬件(UWB定位基站、卡牌)技术架构开发的UWB室内定位系统源码 UWB定位技术 超宽带定位 高精度定位系统源码
18 3
|
6天前
|
JavaScript 前端开发 UED
在Web开发中,拖放(Drag and Drop)和动画效果是提升用户体验的重要工具
【6月更文挑战第12天】本文介绍了如何使用JavaScript实现拖放功能和基本动画效果。拖放功能通过监听mousedown、mousemove和mouseup事件,计算并更新元素位置实现。动画效果则利用requestAnimationFrame函数创建平滑移动的视觉效果。示例代码包括HTML结构和对应的JavaScript实现。
29 1