|
@@ -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();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|