1a51cdcc004bd39e3dbb70d2fb2562d434cd53ce.svn-base 4.3 KB

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