EscapeUtil.java 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package com.futu.course.common.utils;
  2. /**
  3. * 转义和反转义工具类
  4. *
  5. */
  6. public class EscapeUtil
  7. {
  8. public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)";
  9. private static final char[][] TEXT = new char[64][];
  10. static
  11. {
  12. for (int i = 0; i < 64; i++)
  13. {
  14. TEXT[i] = new char[] { (char) i };
  15. }
  16. // special HTML characters
  17. TEXT['\''] = "&#039;".toCharArray(); // 单引号
  18. TEXT['"'] = "&#34;".toCharArray(); // 双引号
  19. TEXT['&'] = "&#38;".toCharArray(); // &符
  20. TEXT['<'] = "&#60;".toCharArray(); // 小于号
  21. TEXT['>'] = "&#62;".toCharArray(); // 大于号
  22. }
  23. /**
  24. * 转义文本中的HTML字符为安全的字符
  25. *
  26. * @param text 被转义的文本
  27. * @return 转义后的文本
  28. */
  29. public static String escape(String text)
  30. {
  31. return encode(text);
  32. }
  33. /**
  34. * 还原被转义的HTML特殊字符
  35. *
  36. * @param content 包含转义符的HTML内容
  37. * @return 转换后的字符串
  38. */
  39. public static String unescape(String content)
  40. {
  41. return decode(content);
  42. }
  43. /**
  44. * 清除所有HTML标签,但是不删除标签内的内容
  45. *
  46. * @param content 文本
  47. * @return 清除标签后的文本
  48. */
  49. public static String clean(String content)
  50. {
  51. return new HTMLFilter().filter(content);
  52. }
  53. /**
  54. * Escape编码
  55. *
  56. * @param text 被编码的文本
  57. * @return 编码后的字符
  58. */
  59. private static String encode(String text)
  60. {
  61. if (StringUtils.isEmpty(text))
  62. {
  63. return StringUtils.EMPTY;
  64. }
  65. final StringBuilder tmp = new StringBuilder(text.length() * 6);
  66. char c;
  67. for (int i = 0; i < text.length(); i++)
  68. {
  69. c = text.charAt(i);
  70. if (c < 256)
  71. {
  72. tmp.append("%");
  73. if (c < 16)
  74. {
  75. tmp.append("0");
  76. }
  77. tmp.append(Integer.toString(c, 16));
  78. }
  79. else
  80. {
  81. tmp.append("%u");
  82. if (c <= 0xfff)
  83. {
  84. // issue#I49JU8@Gitee
  85. tmp.append("0");
  86. }
  87. tmp.append(Integer.toString(c, 16));
  88. }
  89. }
  90. return tmp.toString();
  91. }
  92. /**
  93. * Escape解码
  94. *
  95. * @param content 被转义的内容
  96. * @return 解码后的字符串
  97. */
  98. public static String decode(String content)
  99. {
  100. if (StringUtils.isEmpty(content))
  101. {
  102. return content;
  103. }
  104. StringBuilder tmp = new StringBuilder(content.length());
  105. int lastPos = 0, pos = 0;
  106. char ch;
  107. while (lastPos < content.length())
  108. {
  109. pos = content.indexOf("%", lastPos);
  110. if (pos == lastPos)
  111. {
  112. if (content.charAt(pos + 1) == 'u')
  113. {
  114. ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16);
  115. tmp.append(ch);
  116. lastPos = pos + 6;
  117. }
  118. else
  119. {
  120. ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16);
  121. tmp.append(ch);
  122. lastPos = pos + 3;
  123. }
  124. }
  125. else
  126. {
  127. if (pos == -1)
  128. {
  129. tmp.append(content.substring(lastPos));
  130. lastPos = content.length();
  131. }
  132. else
  133. {
  134. tmp.append(content.substring(lastPos, pos));
  135. lastPos = pos;
  136. }
  137. }
  138. }
  139. return tmp.toString();
  140. }
  141. public static void main(String[] args)
  142. {
  143. String html = "<script>alert(1);</script>";
  144. String escape = EscapeUtil.escape(html);
  145. // String html = "<scr<script>ipt>alert(\"XSS\")</scr<script>ipt>";
  146. // String html = "<123";
  147. // String html = "123>";
  148. System.out.println("clean: " + EscapeUtil.clean(html));
  149. System.out.println("escape: " + escape);
  150. System.out.println("unescape: " + EscapeUtil.unescape(escape));
  151. }
  152. }