乱码问题,很多,造成的原因也很多,
大致原因有以下几个:
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
@Aspect
public 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中直接代码调用的。可以轻松拦截。