HTML转义和反转义工具类

embedded/2025/3/1 5:35:14/

HTML转义和反转义工具类

java">package com.common.utils;import cn.hutool.http.HTMLFilter;
import org.apache.commons.lang3.StringUtils;/*** 转义和反转义工具类** @author lxx*/
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 charactersTEXT['\''] = "&#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));}
}

http://www.ppmy.cn/embedded/168976.html

相关文章

给虚拟机配置IP

虚拟机IP这里一共有三个地方要设置&#xff0c;具体说明如下&#xff1a; &#xff08;1&#xff09;配置vm虚拟机网段 如果不进行设置&#xff0c;每次启动机器时都可能是随机的IP&#xff0c;不方便我们后续操作。具体操作是&#xff1a;点击编辑→虚拟网络编辑器 选择VMne…

nginx 动态计算拦截非法访问ip

需求&#xff1a;在Nginx上实现一个动态拦截IP的方法&#xff0c;具体是当某个IP在1分钟内访问超过60次时&#xff0c;将其加入Redis并拦截&#xff0c;拦截时间默认1天。 技术选型&#xff1a;使用NginxLuaRedis的方法。这种方案通过Lua脚本在Nginx处理请求时检查Redis中的黑…

Linux:Linux下基本指令(下)

Linux下基本指令(下) 三.Linux下基本指令 01. ls 指令 (罗列当前路径下的文件名) 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#x…

Java Web框架篇之Spring

Java Web系列文章汇总贴: Java Web知识总结汇总 为什么要有Spring(IoC) Web发展的几个阶段 &#xff08;1&#xff09;初级阶段&#xff1a;使用Model1(JSPJavaBean)/Model2(JspServletJavaBean)/三层模型(表示层(JSP/Servlet)业务逻辑层持久化层)进行开发&#xff1b;&#…

P9231 [蓝桥杯 2023 省 A] 平方差--巧妙统计奇数的个数!

P9231 [蓝桥杯 2023 省 A] 平方差 题目 分析统计奇数个数统计4的倍数个数代码 题目 分析 看题目字挺少&#xff0c;条件&#xff0c;目的非常清晰&#xff0c;我脑子中的暴力算法直接涌现出来了^ ^&#xff0c;都是我看来一下L&#xff0c;R的范围QAQ 分享大佬题解 将x表示为…

C/C++易错点:函数指针与指针函数的核心区别与避坑指南

一、核心定义与语法对比 特性指针函数函数指针本质函数&#xff08;返回值为指针类型&#xff09;指针变量&#xff08;指向函数的地址&#xff09;声明语法int* func(int a, int b);int (*func)(int a, int b);关键符号位置*靠近返回值类型&#xff08;属于数据类型&#xff…

使用python做http代理请求

有这样一个需求现在有两台A&#xff0c;B两台电脑组成了一个局域网&#xff0c;在A电脑上开发webjava应用&#xff0c;需要调用第三方接口做http请求&#xff0c;但是这个请求只能在B电脑上请求。 一种解决方案&#xff1a;自定义一个中间服务&#xff0c;在电脑B上运行一个简…

JAVA面试常见题_基础部分_mybatis面试题

1、什么是 MyBatis&#xff1f; 答&#xff1a;MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。 2、讲下 MyBatis 的缓存答 &#xff1a;MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在 session 里面,默认就有,二级缓存放在它的命名空间里,默认是不打…