package com.ruoyi.common.utils.html; 
 | 
  
 | 
import com.ruoyi.common.utils.StringUtils; 
 | 
  
 | 
/** 
 | 
 * 转义和反转义工具类 
 | 
 *  
 | 
 * @author ruoyi 
 | 
 */ 
 | 
public class EscapeUtil 
 | 
{ 
 | 
    public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)"; 
 | 
  
 | 
    private static final char[][] TEXT = new char[64][]; 
 | 
  
 | 
    static 
 | 
    { 
 | 
        for (int i = 0; i < 64; i++) 
 | 
        { 
 | 
            TEXT[i] = new char[] { (char) i }; 
 | 
        } 
 | 
  
 | 
        // special HTML characters 
 | 
        TEXT['\''] = "'".toCharArray(); // 单引号 
 | 
        TEXT['"'] = """.toCharArray(); // 双引号 
 | 
        TEXT['&'] = "&".toCharArray(); // &符 
 | 
        TEXT['<'] = "<".toCharArray(); // 小于号 
 | 
        TEXT['>'] = ">".toCharArray(); // 大于号 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 转义文本中的HTML字符为安全的字符 
 | 
     *  
 | 
     * @param text 被转义的文本 
 | 
     * @return 转义后的文本 
 | 
     */ 
 | 
    public static String escape(String text) 
 | 
    { 
 | 
        return encode(text); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 还原被转义的HTML特殊字符 
 | 
     *  
 | 
     * @param content 包含转义符的HTML内容 
 | 
     * @return 转换后的字符串 
 | 
     */ 
 | 
    public static String unescape(String content) 
 | 
    { 
 | 
        return decode(content); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 清除所有HTML标签,但是不删除标签内的内容 
 | 
     *  
 | 
     * @param content 文本 
 | 
     * @return 清除标签后的文本 
 | 
     */ 
 | 
    public static String clean(String content) 
 | 
    { 
 | 
        return new HTMLFilter().filter(content); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * Escape编码 
 | 
     *  
 | 
     * @param text 被编码的文本 
 | 
     * @return 编码后的字符 
 | 
     */ 
 | 
    private static String encode(String text) 
 | 
    { 
 | 
        if (StringUtils.isEmpty(text)) 
 | 
        { 
 | 
            return StringUtils.EMPTY; 
 | 
        } 
 | 
  
 | 
        final StringBuilder tmp = new StringBuilder(text.length() * 6); 
 | 
        char c; 
 | 
        for (int i = 0; i < text.length(); i++) 
 | 
        { 
 | 
            c = text.charAt(i); 
 | 
            if (c < 256) 
 | 
            { 
 | 
                tmp.append("%"); 
 | 
                if (c < 16) 
 | 
                { 
 | 
                    tmp.append("0"); 
 | 
                } 
 | 
                tmp.append(Integer.toString(c, 16)); 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                tmp.append("%u"); 
 | 
                if (c <= 0xfff) 
 | 
                { 
 | 
                    // issue#I49JU8@Gitee 
 | 
                    tmp.append("0"); 
 | 
                } 
 | 
                tmp.append(Integer.toString(c, 16)); 
 | 
            } 
 | 
        } 
 | 
        return tmp.toString(); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * Escape解码 
 | 
     *  
 | 
     * @param content 被转义的内容 
 | 
     * @return 解码后的字符串 
 | 
     */ 
 | 
    public static String decode(String content) 
 | 
    { 
 | 
        if (StringUtils.isEmpty(content)) 
 | 
        { 
 | 
            return content; 
 | 
        } 
 | 
  
 | 
        StringBuilder tmp = new StringBuilder(content.length()); 
 | 
        int lastPos = 0, pos = 0; 
 | 
        char ch; 
 | 
        while (lastPos < content.length()) 
 | 
        { 
 | 
            pos = content.indexOf("%", lastPos); 
 | 
            if (pos == lastPos) 
 | 
            { 
 | 
                if (content.charAt(pos + 1) == 'u') 
 | 
                { 
 | 
                    ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16); 
 | 
                    tmp.append(ch); 
 | 
                    lastPos = pos + 6; 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16); 
 | 
                    tmp.append(ch); 
 | 
                    lastPos = pos + 3; 
 | 
                } 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                if (pos == -1) 
 | 
                { 
 | 
                    tmp.append(content.substring(lastPos)); 
 | 
                    lastPos = content.length(); 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    tmp.append(content.substring(lastPos, pos)); 
 | 
                    lastPos = pos; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        return tmp.toString(); 
 | 
    } 
 | 
  
 | 
    public static void main(String[] args) 
 | 
    { 
 | 
        String html = "<script>alert(1);</script>"; 
 | 
        String escape = EscapeUtil.escape(html); 
 | 
        // String html = "<scr<script>ipt>alert(\"XSS\")</scr<script>ipt>"; 
 | 
        // String html = "<123"; 
 | 
        // String html = "123>"; 
 | 
        System.out.println("clean: " + EscapeUtil.clean(html)); 
 | 
        System.out.println("escape: " + escape); 
 | 
        System.out.println("unescape: " + EscapeUtil.unescape(escape)); 
 | 
    } 
 | 
} 
 |