123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- package com.hssx.cloudmodel.util;
- import com.baomidou.mybatisplus.core.toolkit.StringUtils;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletRequestWrapper;
- 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.isEmpty(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();
- }
- }
- }
- }
|