zoukankan      html  css  js  c++  java
  • 工具类转义和反转义工具类

    package com.jyc.common.utils.html;

    import com.jyc.common.utils.StringUtils;

    /**
    * 转义和反转义工具类
    *
    * @author jianyongchao
    */
    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['\''] = "&#039;".toCharArray(); // 单引号
    TEXT['"'] = "&#34;".toCharArray(); // 双引号
    TEXT['&'] = "&#38;".toCharArray(); // &
    TEXT['<'] = "&#60;".toCharArray(); // 小于号
    TEXT['>'] = "&#62;".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)
    {
    int len;
    if ((text == null) || ((len = text.length()) == 0))
    {
    return StringUtils.EMPTY;
    }
    StringBuilder buffer = new StringBuilder(len + (len >> 2));
    char c;
    for (int i = 0; i < len; i++)
    {
    c = text.charAt(i);
    if (c < 64)
    {
    buffer.append(TEXT[c]);
    }
    else
    {
    buffer.append(c);
    }
    }
    return buffer.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 html = "<scr<script>ipt>alert(\"XSS\")</scr<script>ipt>";
    // String html = "<123";
    // String html = "123>";
    System.out.println(EscapeUtil.clean(html));
    System.out.println(EscapeUtil.escape(html));
    System.out.println(EscapeUtil.unescape(html));
    }
    }
  • 相关阅读:
    如何将SQLServer2005中的数据同步到Oracle中【转】
    八大排序算法总结[转]
    Web报表相关汇集(个人收藏)
    分析:城域网技术PBT交锋TMPLS
    Ubuntu下通过SSH远程登录服务器的方法
    关于VC代码的编写和调试(三)
    Start Starts a separate window to run a specified program or command.
    罗技劲雕鼠标移动速度过慢问题
    Microsoft XML Core Services 4.0 SP2 KB936181老是提示安装(转,不过我也遇到这个问题了)
    四川人逆境中的幽默
  • 原文地址:https://www.cnblogs.com/qq3245792286/p/15469724.html
Copyright © 2011-2022 走看看