项目使用SSM项目架构,Spring MVC中文过滤器只能过滤POST请求,网上大部分教程通过修改Tomcat配置文件修改get传参时中文乱码问题:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
这种办法每次换Tomcat时如果忘记设置又会重现中文乱码,如果个get传参为单个字符串是可以使用:
new String(String.getBytes("ISO8859-1"), "UTF-8")
不过在项目中大部分传参时使用json传参,action用model接收,所以写了一个工具类,使用java反射机制获取model所有属性,判断属性是否出现中文乱码,如出现中文乱码矫正中文乱码
public static Object reflectTest(Object model) throws NoSuchMethodException,
IllegalAccessException, IllegalArgumentException,
InvocationTargetException, IntrospectionException {
// 获取实体类的所有属性,返回Field数组
Field[] field = model.getClass().getDeclaredFields();
// 遍历所有属性
for (int j = 0; j < field.length; j++) {
// 获取属性的名字
String name = field[j].getName();
System.out.println("属性为:" + name);
PropertyDescriptor pd = new PropertyDescriptor(name, model.getClass());
// 获取属性的类型
String type = field[j].getGenericType().toString();
/获取String类型属性
if (type.equals("class java.lang.String")) {
Method m = pd.getReadMethod();
String value = (String) m.invoke(model);
System.out.println("数据类型为:String");
if (value != null) {
Method wm = pd.getWriteMethod();
System.out.println("汉化前值为:"+value);
//如果不为空进行汉化
value = toChinese(value);
wm.invoke(model, value);
System.out.println("属性值为:" + value);
} else {
System.out.println("属性值为:空");
}
}
}
return model;
}
public static String toChinese(String tempMsg){
//判断字符串是否出现中文乱码
if(isMessyCode(tempMsg)){
try {
return new String(tempMsg.getBytes("ISO8859-1"), "UTF-8");
} catch (Exception e) {
}
}
return tempMsg ;
}
private static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
public static boolean isMessyCode(String strName) {
Pattern p = Pattern.compile("\\s*|\t*|\r*|\n*");
Matcher m = p.matcher(strName);
String after = m.replaceAll("");
String temp = after.replaceAll("\\p{P}", "");
char[] ch = temp.trim().toCharArray();
float chLength = 0 ;
float count = 0;
for (int i = 0; i < ch.length; i++) {
char c = ch[i];
if (!Character.isLetterOrDigit(c)) {
if (!isChinese(c)) {
count = count + 1;
}
chLength++;
}
}
float result = count / chLength ;
if (result > 0.4) {
return true;
} else {
return false;
}
}