JAVA GET传参中文乱码问题

项目使用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;
            }
        }

猜你喜欢

转载自blog.csdn.net/sunguoqiang1213/article/details/79883798