Java过滤HTML标签工具类
过滤HTML标签能有效的放置XSS攻击。
封装:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import java.util.regex.Matcher;
import java.util.regex.Pattern; /**
* HTML标签过滤工具
*
* @author jim
* @date 2017/11/27
*/
public final class HtmlUtils { private static final Logger logger = LoggerFactory.getLogger(HtmlUtils.class); /**
* 禁止实例化
*/
private HtmlUtils() {
throw new IllegalStateException("禁止实例化");
} /**
* 过滤HTML标签输出文本
*
* @param inputString 原字符串
* @return 过滤后字符串
*/
public static String Html2Text(String inputString) {
if (StringUtils.isEmpty(inputString)) {
return "";
} // 含html标签的字符串
String htmlStr = inputString.trim();
String textStr = "";
Pattern p_script;
Matcher m_script;
Pattern p_style;
Matcher m_style;
Pattern p_html;
Matcher m_html;
Pattern p_space;
Matcher m_space;
Pattern p_escape;
Matcher m_escape; try {
// 定义script的正则表达式{或<script[^>]*?>[\\s\\S]*?<\\/script>
String regEx_script = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>"; // 定义style的正则表达式{或<style[^>]*?>[\\s\\S]*?<\\/style>
String regEx_style = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>"; // 定义HTML标签的正则表达式
String regEx_html = "<[^>]+>"; // 定义空格回车换行符
String regEx_space = "\\s*|\t|\r|\n"; // 定义转义字符
String regEx_escape = "&.{2,6}?;"; // 过滤script标签
p_script = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE);
m_script = p_script.matcher(htmlStr);
htmlStr = m_script.replaceAll(""); // 过滤style标签
p_style = Pattern.compile(regEx_style, Pattern.CASE_INSENSITIVE);
m_style = p_style.matcher(htmlStr);
htmlStr = m_style.replaceAll(""); // 过滤html标签
p_html = Pattern.compile(regEx_html, Pattern.CASE_INSENSITIVE);
m_html = p_html.matcher(htmlStr);
htmlStr = m_html.replaceAll(""); // 过滤空格回车标签
p_space = Pattern.compile(regEx_space, Pattern.CASE_INSENSITIVE);
m_space = p_space.matcher(htmlStr);
htmlStr = m_space.replaceAll(""); // 过滤转义字符
p_escape = Pattern.compile(regEx_escape, Pattern.CASE_INSENSITIVE);
m_escape = p_escape.matcher(htmlStr);
htmlStr = m_escape.replaceAll(""); textStr = htmlStr; } catch (Exception e) {
logger.info("Html2Text:{}", e.getMessage());
} // 返回文本字符串
return textStr;
}
}
简单点的方式:
/**
* 删除所有的HTML标签
*
* @param source 需要进行除HTML的文本
* @return
*/
public static String deleteAllHTMLTag(String source) { if(source == null) {
return "";
} String s = source;
/** 删除普通标签 */
s = s.replaceAll("<(S*?)[^>]*>.*?|<.*? />", "");
/** 删除转义字符 */
s = s.replaceAll("&.{2,6}?;", "");
return s;
}
其它:
Spring HtmlUtils可以实现HTML与转义字符之间的转换,但不能过滤HTML标签。
参考:
http://blog.csdn.net/hj7jay/article/details/51072327
https://www.cnblogs.com/shz365/p/5127271.html
http://hw1287789687.iteye.com/blog/2235927
http://blog.csdn.net/PKWind/article/details/49756429
http://blog.csdn.net/breaker892902/article/details/38556309
Java过滤HTML标签工具类的更多相关文章
- Java 后台验证的工具类
Java 后台验证的工具类 public class ValidationUtil { //手机号 public static String mobile = "^( ...
- JSTL标签工具类
一.介绍: 1.Jsp Standrad Tag Lib: JSP中标准的标签工具类 2.由 sun公司 提供 3.组成:(1)核心标签:Java在jsp上基本功能进行封装 if whil ...
- 过滤敏感词工具类SensitiveFilter
网上过滤敏感词工具类有的存在挺多bug,这是我自己改用的过滤敏感词工具类,目前来说没啥bug,如果有bug欢迎在评论指出 使用前缀树 Trie 实现的过滤敏感词,树节点用静态内部类表示了,都写在一个 ...
- Rhino+envjs-1.2.js 在java运行网站js 工具类
java爬虫遇到个页面加密的东西,找了些资料学习学习 做了个java运行js的工具类,希望对大家有用,其中用到client(获取js)可以自行换成自己的client.主要是用了 Rhino就是Java ...
- java中常用的工具类(一)
我们java程序员在开发项目的是常常会用到一些工具类.今天我汇总了一下java中常用的工具方法.大家可以在项目中使用.可以收藏!加入IT江湖官方群:383126909 我们一起成长 一.String工 ...
- Java学习-041-颜色工具类(RGB,HEX)
在日常的网页开发中,经常需要进行颜色数值获取.转换,例如获取红色,获取蓝色,获取绿色,RGB转十六进制颜色,十六进制颜色转RGB等,因而在学习过程中,写了一个小工具类,仅供各位小主参考! 多不闲言,直 ...
- JAVA中封装JSONUtils工具类及使用
在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...
- JAVA自动生成正则表达式工具类
经过很久的努力,终于完成了JAVA自动生成正则表达式工具类.还记得之前需要正则,老是从网上找吗?找了想修改也不会修改.现在不用再为此烦恼了,使用此生成类轻松搞定所有正则表达式.赶快在同事面前炫一下吧. ...
- java 二进制数字符串转换工具类
java 二进制数字符串转换工具类 将二进制转换成八进制 将二进制转换成十进制 将二进制转换成十六进制 将十进制转换成二进制 package com.iteye.injavawetrust.ad; i ...
随机推荐
- arm页表在linux中的融合
参考:arm-linux内存页表创建 arm的第一级页表条目数为4096个,对于4K页第二级目录条目个数为256个,一级二级条目都是每个条目4字节. 在linux下二级分页如下:虚拟地址——> ...
- hdu 3836 tarjain 求强连通分量个数
// 给你一个有向图,问你最少加几条边能使得该图强连通 #include <iostream> #include <cstdio> #include <cstring&g ...
- loj2254 「SNOI2017」一个简单的询问
ref #include <algorithm> #include <iostream> #include <cstdio> #include <cmath& ...
- hexo博客出现“Cannot GET/xxxx”的错误
最近在github上搭了一个hexo博客系统,非常轻量级的,只需要几句nodejs命令就搭建完成了.我了解了一下,hexo博客是基于nodejs写的,采用ejs模板引擎编写页面. 因为默认的主题风格不 ...
- struts2对properties资源的处理
struts2对properties资源的处理 做了一些功能增强 包括: 可以读取项的描述 可以读取项所在的行号,文件路径等 实现方式 继承了java的java.util.Properties实现了一 ...
- 【Java学习笔记之九】java二维数组及其多维数组的内存应用拓展延伸
多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在 ...
- python-高级编程-02
[yield 详解 协同程序 生成器表达式] 1> yield def res (): for i in range(10): x = yield i r = res() print r.nex ...
- 让 PHP COOKIE 立即生效(不用刷新就可以使用)
<?php function set_my_cookie($, $path = '', $domain = '') { $_COOKIE[$var] = $value; setcookie($v ...
- 算法理论——Linear SVM
问题引入 下面的三个超平面都起到分类的效果,哪个最好? 答案显然是第三个.为什么? 直觉上,如果现在我们有个测试点,非常靠近右下角的那个红叉叉,也就是说这个点的特征与那个红叉叉非常接近,这时候,我们希 ...
- C++之Effective STL学习笔记Item7
假设我们现在有以下代码: void doSomething() { vector<Widget*> vwp; ; i < SOME_MAGIC_NUMBER; ++i) vwp.pu ...