spring 处理乱码的一个非常规方法

来源:互联网 发布:linux 窗口编程工具 编辑:程序博客网 时间:2024/06/15 15:55

乱码问题,很多,造成的原因也很多,
大致原因有以下几个:

1. 项目决定用 UTF-8
2. 程序的源码要用 UTF-8(Java,HTML)
3. HTML 的 meta 里要指定用 UTF-8
4. 数据库用 UTF-8
5. 数据库和 Java 的连接用 UTF-8
6. Tomcat 的 Get 设置为用 UTF-8

我这里还有一个比较坑爹的方法,
不多说,直接上代码

package com.flat.manger.filter;import java.lang.reflect.Field;import java.lang.reflect.Modifier;import org.apache.commons.lang3.StringUtils;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.stereotype.Component;/** * @description: <br/> * @version: 1<br/> * @package com.flat.manger.filter.Utf8Aspect.java * @author YangPu * @date 2017年3月23日 下午6:16:48 */@Component@Aspectpublic class Utf8Aspect {    private static final String point_cut_manger = "execution(* com.flat.manger.service.*.*(..))";    private static final String point_cut_sciener = "execution(* com.flat.sciener.service.*.*(..))";    @Before(value = point_cut_manger)    public void point_cut_manger(JoinPoint joinPoint) {        utf8(joinPoint);    }    @Before(value = point_cut_sciener)    public void point_cut_sciener(JoinPoint joinPoint) {        utf8(joinPoint);    }    public void utf8(JoinPoint point) {        Object[] params = point.getArgs();        if (params != null) {            for (Object param : params) {                if (param != null) {                    try {                        Class<?> clazz = param.getClass();                        for (; clazz != Object.class; clazz = clazz.getSuperclass()) {                            Field[] fields = clazz.getDeclaredFields();                            for (Field field : fields) {                                int mod = field.getModifiers();                                if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {                                    continue;                                }                                field.setAccessible(true);                                Object val = field.get(param);                                if (val instanceof String) {                                    String value = (String) val;                                    if (StringUtils.isNotEmpty(value)) {                                        value = new String(value.getBytes("ISO8859-1"), "utf-8");                                    }                                    field.set(param, value);                                }                            }                        }                    } catch (Exception e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                }            }        }    }}

核心思想:就是在进入service方法之前,用spring aop执行一段代码,这段代码,就是把service的参数,全部重新编码

为什么不把切面放到controller中呢?我试了一下,不行。大概原因:controller是spring mvc反射调用的,aop拦截不到,而service都是在controller中直接代码调用的。可以轻松拦截。

0 0
原创粉丝点击