Browse Source

过滤表情

quyueting 5 years ago
parent
commit
feba6dd838

+ 127 - 0
minigame/src/com/estates/filter/EmojiHttpServletRequestWraper.java

@@ -0,0 +1,127 @@
+package com.estates.filter;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+import org.apache.commons.lang.StringUtils;
+
+
+public class EmojiHttpServletRequestWraper extends HttpServletRequestWrapper {
+
+    public EmojiHttpServletRequestWraper(HttpServletRequest request) {
+        super(request);
+    }
+    
+    @Override
+    public String getParameter(String name) {
+        return filterEmoji(super.getParameter(name));
+    }
+    
+    @Override
+    public String getHeader(String name) {
+        return filterEmoji(super.getParameter(name));
+    }
+    
+    
+    
+    @Override
+    public String[] getParameterValues(String name) {
+        System.out.println("getParameterValues----->转义处理:"+name);
+        if(!StringUtils.isEmpty(name)){
+            String[] values = super.getParameterValues(name);
+            if(values != null ){
+            	if(values.length > 0) {
+            		String[] newValues = new String[values.length];
+            		
+            		for(int i =0; i< values.length; i++){
+            			if (containsEmoji(values[i])) {
+            				System.out.println("包含emoji:"+values[i]);
+            				newValues[i] = filterEmoji(values[i]);
+            				System.out.println("包含emoji,处理后:"+newValues[i]);
+            			} else {
+            				newValues[i] = values[i];
+            			}
+            		}
+            		return newValues;
+            	}
+            } 
+        }
+        return null;
+    }
+
+    
+    public static boolean containsEmoji(String source) {
+        if (StringUtils.isBlank(source)) {
+            return false;
+        }
+
+        int len = source.length();
+
+        for (int i = 0; i < len; i++) {
+            char codePoint = source.charAt(i);
+
+            if (isEmojiCharacter(codePoint)) {
+                //do nothing,判断到了这里表明,确认有表情字符
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    private static boolean isEmojiCharacter(char codePoint) {
+        return (codePoint == 0x0) || 
+                (codePoint == 0x9) ||                            
+                (codePoint == 0xA) ||
+                (codePoint == 0xD) ||
+                ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) ||
+                ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) ||
+                ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
+    }
+
+    /**
+     * 过滤emoji 或者 其他非文字类型的字符
+     * @param source
+     * @return
+     */
+    public static String filterEmoji(String source) {
+    	if (source == null || "".equals(source)) {
+    		return source;
+    	}
+    	System.out.println("过滤 = "+source);
+        source = source.replaceAll("[\\ud800\\udc00-\\udbff\\udfff\\ud800-\\udfff]", "*");
+        if (!containsEmoji(source)) {
+            return source;//如果不包含,直接返回
+        }
+        //到这里铁定包含
+        StringBuilder buf = null;
+
+        int len = source.length();
+
+        for (int i = 0; i < len; i++) {
+            char codePoint = source.charAt(i);
+
+            if (isEmojiCharacter(codePoint)) {
+                if (buf == null) {
+                    buf = new StringBuilder(source.length());
+                }
+
+                buf.append(codePoint);
+            } else {
+                buf.append("*");
+            }
+        }
+
+        if (buf == null) {
+            return source;//如果没有找到 emoji表情,则返回源字符串
+        } else {
+            if (buf.length() == len) {//这里的意义在于尽可能少的toString,因为会重新生成字符串
+                buf = null;
+                return source;
+            } else {
+                return buf.toString();
+            }
+        }
+
+    }
+}

+ 2 - 1
minigame/src/com/hssx/controller/UserController.java

@@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.estates.filter.EmojiHttpServletRequestWraper;
 import com.hssx.constant.Constant;
 import com.hssx.constant.Constant;
 import com.hssx.entity.User;
 import com.hssx.entity.User;
 import com.hssx.entity.UserExample;
 import com.hssx.entity.UserExample;
@@ -64,7 +65,7 @@ public class UserController {
 				System.out.println(resp);
 				System.out.println(resp);
 				json = (JSONObject) JSON.parse(resp);
 				json = (JSONObject) JSON.parse(resp);
 				if (!json.containsKey("errcode")) {
 				if (!json.containsKey("errcode")) {
-					user.setNickName(json.getString("nickname"));
+					user.setNickName(EmojiHttpServletRequestWraper.filterEmoji(json.getString("nickname")));
 					user.setHeaderPic(json.getString("headimgurl"));
 					user.setHeaderPic(json.getString("headimgurl"));
 				}
 				}
 				System.out.println(user + "user");
 				System.out.println(user + "user");