分享一个jpress用到的jsoup工具类,支持base64图片等,更加完善和符合现代互联网的使用场景

技术

2016-08-14

2834

13

这个工具类的代码在:https://github.com/JpressProjects/jpress/blob/master/jpress/jpress-utils/src/main/java/io/jpress/utils/JsoupUtils.java 

里面主要是用到了自定义白名单的功能,允许base64的图片提交,增加video等更多html5属性支持,同时极易扩展更多的标签和属性。

 

拿走不谢。

 

package io.jpress.utils;

import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Attribute;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupUtils {

	public static String getFirstImageSrc(String html) {
		if (html == null)
			return null;

		Elements es = Jsoup.parseBodyFragment(html).select("img");
		if (es != null && es.size() > 0)
			return es.first().attr("src");

		return null;
	}

	public static List getImageSrcs(String html) {
		if (StringUtils.isBlank(html)) {
			return null;
		}

		List list = new ArrayList();

		Document doc = Jsoup.parseBodyFragment(html);
		Elements es = doc.select("img");
		if (es != null && es.size() > 0) {
			for (Element e : es) {
				list.add(e.attr("src"));
			}
		}
		return list;
	}

	static MyWhitelist  whitelist = new MyWhitelist();
	public static String clear(String html) {
		if (StringUtils.isNotBlank(html))
			return Jsoup.clean(html, whitelist);

		return html;
	}
	
	/**
	 * 做自己的白名单,允许base64的图片通过等
	 * @author michael
	 */
	public static class MyWhitelist extends org.jsoup.safety.Whitelist {
	    public MyWhitelist() {
	    	
	        addTags("a", "b", "blockquote", "br", "caption", "cite", "code", "col",
	                "colgroup", "dd", "div", "dl", "dt", "em", "h1", "h2", "h3", "h4", "h5", "h6",
	                "i", "img", "li", "ol", "p", "pre", "q", "small", "strike", "strong",
	                "sub", "sup", "table", "tbody", "td", "tfoot", "th", "thead", "tr", "u",
	                "ul");
	        
	        addAttributes("a", "href", "title", "target");
	        addAttributes("blockquote", "cite");
	        addAttributes("col", "span");
	        addAttributes("colgroup", "span");
	        addAttributes("img", "align", "alt", "src", "title");
	        addAttributes("ol", "start");
	        addAttributes("q", "cite");
	        addAttributes("table", "summary");
	        addAttributes("td", "abbr", "axis", "colspan", "rowspan", "width");
	        addAttributes("th", "abbr", "axis", "colspan", "rowspan", "scope", "width");
	        addAttributes("video","src","autoplay","controls","loop","muted","poster","preload");
	        
			addAttributes(":all", "class");
			addAttributes(":all", "style");
			addAttributes(":all", "height");
			addAttributes(":all", "width");
			addAttributes(":all", "type");
			addAttributes(":all", "id");
			addAttributes(":all", "name");
	        
	        addProtocols("a", "href", "ftp", "http", "https", "mailto","tel");
	        addProtocols("blockquote", "cite", "http", "https");
	        addProtocols("cite", "cite", "http", "https");
	        addProtocols("img", "src", "http", "https");
	        addProtocols("q", "cite", "http", "https");
	    }

	    @Override
	    protected boolean isSafeAttribute(String tagName, Element el, Attribute attr) {
	        return ("img".equals(tagName)
	                && "src".equals(attr.getKey())
	                && attr.getValue().startsWith("data:;base64")) ||
	            super.isSafeAttribute(tagName, el, attr);
	    }
	}

}

发表评论

全部评论:13条

杨福海 2016-08-16

引用来之于zp19890911的内容

能评论?

必须能评论!!

zp19890911 2016-08-16

能评论?

zp19890911 2016-08-16

测试

杨福海

世界上最好的语言是Java语言...