浅谈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,如需转载请自行联系
原作者









相关文章
|
6天前
|
数据库 开发者 Python
web应用开发
【9月更文挑战第1天】web应用开发
20 1
|
3天前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
5天前
|
数据采集 存储 前端开发
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
Java爬虫开发:Jsoup库在图片URL提取中的实战应用
|
4天前
|
前端开发 JavaScript 持续交付
Web应用开发的方法
Web应用开发的方法
7 1
|
4天前
|
前端开发 JavaScript 持续交付
web应用开发
web应用开发
10 1
|
6天前
|
Web App开发 数据采集 iOS开发
「Python+Dash快速web应用开发」
这是「Python+Dash快速web应用开发」系列教程的第十六期,本期将介绍如何在Dash应用中实现多页面路由功能。通过使用`Location()`组件监听URL变化,并结合回调函数动态渲染不同页面内容,使应用更加模块化和易用。教程包括基础用法、页面重定向及无缝跳转等技巧,并通过实例演示如何构建个人博客网站。
18 2
|
1天前
|
关系型数据库 Java MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【9月更文挑战第6天】在Linux环境下安装JDK 1.8、Tomcat和MariaDB是搭建Java Web应用的关键步骤。本文详细介绍了使用apt-get安装OpenJDK 1.8、下载并配置Tomcat,以及安装和安全设置MariaDB(MySQL的开源分支)的方法。通过这些步骤,您可以快速构建一个稳定、高效的开发和部署环境,并验证各组件是否正确安装和运行。这为您的Java Web应用提供了一个坚实的基础。
9 0
WK
|
3天前
|
数据采集 API 开发者
很少有人用python开发web???
Python 是一种流行且广泛使用的编程语言,尤其在 Web 开发领域。它凭借简洁的语法、丰富的框架(如 Django 和 Flask)、强大的库支持及活跃的社区,成为许多开发者和企业的首选。Python 的易学性、高效性及广泛的应用场景(包括 Web API、微服务和数据分析等)使其在 Web 开发中占据重要地位,并将持续发挥更大作用。
WK
14 0
|
7天前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
34 0
|
7天前
|
数据库 开发者 Java
数据战争:Hibernate的乐观与悲观锁之争,谁将主宰并发控制的王座?
【8月更文挑战第31天】在软件开发中,数据一致性至关重要,尤其是在多用户并发访问环境下。Hibernate 作为 Java 社区常用的 ORM 框架,提供了乐观锁和悲观锁机制来处理并发问题。乐观锁假设数据不易冲突,通过版本号字段 (`@Version`) 实现;悲观锁则假定数据易冲突,在读取时即加锁。选择哪种锁取决于具体场景:乐观锁适合读多写少的情况,减少锁开销;悲观锁适合写操作频繁的场景,避免数据冲突。正确应用这些机制可提升应用程序的健壮性和效率。
17 0
下一篇
DDNS