java-web过滤器-富文本

现在需要解决的问题是,针对某些富文本的接口,需要保留常用的html富文本标签,不能完全过滤。

针对某些接口,或者url这个好办,直接在过滤时对uri地址进行筛选。

@Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {

        String uri = httpServletRequest.getRequestURI();
        if(uri.startsWith("/filter/richText")){
            //走富文本过滤器
            RichTextParamtersWrapper wrapper = new RichTextParamtersWrapper((HttpServletRequest) httpServletRequest);
            filterChain.doFilter(wrapper, httpServletResponse);
            return;
        }
        //其他过滤器
        ModifyParametersWrapper wrapper = new ModifyParametersWrapper((HttpServletRequest) httpServletRequest);
        filterChain.doFilter(wrapper, httpServletResponse);
    }

难办的是针对富文本常见的标签,正则是不会写的,这辈子都写不来正则( ╯□╰ )
搜了一下,貌似可以用Jsoup这个东西。它主要功能是解析html,常见是用来做爬虫的,我们可以通过加白名单(黑名单不建议,白名单的把控更好)的方式实现富文本的过滤。
参考文档
https://blog.csdn.net/skyrunner06/article/details/25876693
添加的依赖

 <dependency>
       <groupId>org.jsoup</groupId>
       <artifactId>jsoup</artifactId>
       <version>1.8.3</version>
</dependency>
通过加载白名单配置文件的方式(改起来方便),将允许的标签添加到Jsoup的WhiteList规则里。
public class JsoupUtil {

    public static Whitelist whitelist = null;

    /**
     * 配置Jsoup标签白名单
     * @return
     */
    public static Whitelist initWhiteList() {
        if (whitelist == null) synchronized (new Object()) {
            whitelist = Whitelist.relaxed();
            String jsonString = null;
            Resource resource = new ClassPathResource("/whitelist.conf");
            File file = null;
            InputStream input = null;
            Writer output = null;
            try {
                file = resource.getFile();
                input = new FileInputStream(file);
                output = new StringWriter();
                IOUtils.copy(input, output);
                jsonString = output.toString();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                if (input != null) {
                    IOUtils.closeQuietly(input);
                }
                if (output != null) {
                    IOUtils.closeQuietly(output);
                }
            }

            JSONObject whiteJson = JSONObject.parseObject(jsonString);
            JSONObject whiteListMap = whiteJson.getJSONObject("whiteList");
            JSONObject protocolsMap = whiteJson.getJSONObject("protocols");

            for (Map.Entry<String, Object> entry : whiteListMap.entrySet()) {
                String tag = entry.getKey();

                whitelist.addTags(tag);
                JSONObject whiteListMap2 = (JSONObject) entry.getValue();

                for (Map.Entry<String, Object> entry2 : whiteListMap2.entrySet()) {
                    String attribute = entry2.getKey();
                    whitelist.addAttributes(tag, attribute);
                }
            }
            for (Map.Entry<String, Object> entry : protocolsMap.entrySet()) {
                String tag = entry.getKey().substring(0, entry.getKey().indexOf("."));
                String key = entry.getKey().substring(entry.getKey().indexOf(".") + 1, entry.getKey().length());

                JSONArray jsonArray = JSONArray.parseArray(entry.getValue().toString());

                for (int i = 0; i < jsonArray.size(); i++) {
                    String value = jsonArray.getString(i);
                    //给URL属性添加协议。例如: addProtocols("a", "href", "ftp", "http", "https")标签a的href键可以指向的协议有ftp、http、https
                    whitelist.addProtocols(tag, key, value);
                }
            }
        }
        return whitelist;
    }
}

使用时:
 /**
     * 针对富文本的字符替换
     * 只有在白名单中出现的html标签才会被保留
     * @param value
     * @return
     */
    public static String richText(String value){
        JsoupUtil.initWhiteList();
        value = Jsoup.clean(value, "", JsoupUtil.whitelist);
        return value;
    }

最后是白名单配置文件

{
    "whiteList":{
        "a":{
            "href":"",
            "title":""
        },
        "b":{

        },
        "blockquote":{
            "cite":""
        },
        "br":{

        },
        "caption":{

        },
        "cite":{

        },
        "code":{

        },
        "col":{
            "span":"",
            "width":""
        },
        "colgroup":{
            "span":"",
            "width":""
        },
        "dd":{

        },
        "div":{
            "style":"/^text-align:\\s*(left|right|center);?\\s*$/i"
        },
        "dl":{

        },
        "dt":{

        },
        "em":{

        },
        "h1":{

        },
        "h2":{

        },
        "h3":{

        },
        "h4":{

        },
        "h5":{

        },
        "h6":{

        },
        "i":{

        },
        "img":{
            "align":"",
            "alt":"",
            "height":"",
            "src":"",
            "title":"",
            "width":""
        },
        "li":{
            "class":"",
            "style":"/^text-align:\\s*(left|right|center);?\\s*$/i"
        },
        "ol":{
            "start":"",
            "type":""
        },
        "p":{
              "style":"/^text-align:\\s*(left|right|center);?\\s*$/i"
            },
        "pre":{

        },
        "q":{
            "cite":""
        },
        "small":{

        },
        "span":{
            "style":"/^\\s*font-family\\s*:\\s*(('|\\\"|\"|')?(楷体|楷体_GB2312|宋体|微软雅黑|黑体|,|\\s|\\w|sans-serif)('|\\\"|\"|')?)+;?\\s*|\\s*(color|font-size|background-color)\\s*:\\s*(#\\w*|[\\w\\s]*|rgb\\s*\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*\\));?\\s*|\\s*text-decoration\\s*:\\s*(underline|overline|line-through|blink)\\s*;?\\s*$/i"

         },

        "strike":{

        },
        "strong":{

        },
        "sub":{

        },
        "sup":{

        },
        "table":{
            "summary":"",
            "width":""
        },
        "tbody":{

        },
        "td":{
            "abbr":"",
            "axis":"",
            "colspan":"",
            "rowspan":"",
            "width":""
        },
        "tfoot":{

        },
        "th":{
            "abbr":"",
            "axis":"",
            "colspan":"",
            "rowspan":"",
            "scope":"",
            "width":""
        },
        "thead":{

        },
        "tr":{

        },
        "u":{

        },
        "ul":{
            "type":"",
            "class":""
        }
    },
    "protocols":{
        "a.href":[
            "ftp",
            "http",
            "https",
            "mailto"
        ],
        "blockquote.cite":[
            "http",
            "https"
        ],
        "cite.cite":[
            "http",
            "https"
        ],
        "img.src":[
            "http",
            "https"
        ],
        "q.cite":[
            "http",
            "https"
        ]
    }
}

一个针对富文本的过滤器get√

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容