开发者社区> 技术小胖子> 正文

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









版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
JavaWeb项目的中文乱码的原因以及Servlet中处理GET请求和POST请求编码过滤器
一、乱码原因 ①传输方和接收方采用的编码不一致。传输方对参数采用的是UTF-8编码而接收方却用GBK进行解析,当然是乱码。 ②Tomcat服务器默认采用的ISO8859-1编码得到参数值。虽然①中采用了同样的编码方式,但经过tomcat一处理,也会出现乱码(GET方式)   二、解决办法 方法一 每次传输都手动设置编码(GET方式传输数据) 传输方 String name =
1336 0
android用eclipse开发碰到65535问题的完美解决方案
android用eclipse开发碰到65535问题的完美解决方案
24 0
Ionic 开发中遇到的常见问题及解决方案
Ionic 常见问题及解决方案
7999 0
如何解决前端开发中遇到的问题
解决问题的第一步一般是调试,调试之后发现也解决不了的问题的时候再去Google。Google的科学使用也包含了很多内容,这里我们先说如何不通过Google解决遇到的问题。
746 0
Linux服务器JRE中文字体设置,解决java.awt乱码、显示方块问题
最近因为需要在java应用中合成曲线图,使用了jfreechart库,但是发现图片中的中文全都显示成方块了。Linux机器一般都是没有中文字体的,所以在使用java.awt相关类生成图片时,输出的中文很可能显示乱码或者呈方块状。解决方案就是在服务器启动脚本里,加上安装中文字体的步骤。
1387 0
基于Tomcat的JSP开发过程中的中文乱码问题解决
   今天像往常一样学习 JSP  但是在 提交表单数据的时候问题出现了 我这里所说的是 JSP获取表单数据时候的乱码问题 ,然后我百思不得其解 重复试验了很多次 依然没结果 最后百度 了好久终于解决了 这个问题   这个问题是Tomcat下 的JSP开发经常遇到的问题  .
701 0
JNA 实际开发中若干问题解决方法
JNA 实际开发中若干问题解决方法
8755 0
21115
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载