本文目录导读:

我来详细说明一下 JEditorPane 和 HTMLEditorKit 中的脚本支持情况。
JEditorPane + HTMLEditorKit 的脚本支持
核心限制
JEditorPane 和 HTMLEditorKit 本身不支持 JavaScript 脚本执行,这是一个重要的安全性和功能限制。
详细说明
默认行为
JEditorPane editor = new JEditorPane();
editor.setContentType("text/html");
editor.setText("<html><body><script>alert('test')</script>Hello</body></html>");
// 脚本标签会被忽略,只显示 "Hello"
为什么不支持脚本
- 安全考虑:防止 XSS 攻击和恶意代码执行
- 设计目的:轻量级 HTML 渲染,不是完整浏览器
- 功能范围:主要支持文本格式化、链接、基本样式
实际支持的 HTML 元素
// 支持的元素 HTML.Tag.P // 段落 HTML.Tag.B // 粗体 HTML.Tag.I // 斜体 HTML.Tag.A // 链接 HTML.Tag.IMG // 图片(有限支持) HTML.Tag.TABLE // 表格 HTML.Tag.FONT // 字体样式 // 不支持的元素 HTML.Tag.SCRIPT // 脚本(被忽略) HTML.Tag.OBJECT // 对象 HTML.Tag.APPLET // Applet
处理脚本标签的代码示例
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;
import javax.swing.text.html.HTML;
import javax.swing.text.MutableAttributeSet;
import java.io.StringReader;
public class ScriptHandler {
public static void main(String[] args) {
String html = "<html><body><script>alert('test')</script>Hello World</body></html>";
// 方式1:使用 HTML 编辑器
JEditorPane editor = new JEditorPane();
editor.setContentType("text/html");
editor.setText(html);
// 方式2:自定义解析器移除脚本
String cleanedHtml = removeScripts(html);
editor.setText(cleanedHtml);
}
private static String removeScripts(String html) {
return html.replaceAll("<script[^>]*>.*?</script>", "");
}
}
替代方案
如果需要执行 JavaScript
// 使用 Java 的 ScriptEngine(Nashorn - Java 8+, GraalVM - Java 11+)
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval("function test() { return 'Hello'; }");
完整浏览器功能
// 使用 JavaFX WebView(推荐)
import javafx.scene.web.WebView;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
public class WebViewExample extends Application {
@Override
public void start(Stage stage) {
WebView webView = new WebView();
webView.getEngine().loadContent(
"<html><body><script>alert('JS Works!')</script></body></html>"
);
StackPane root = new StackPane(webView);
Scene scene = new Scene(root, 800, 600);
stage.setScene(scene);
stage.show();
}
}
自定义 HTMLEditorKit
public class CustomHTMLEditorKit extends HTMLEditorKit {
@Override
public Document createDefaultDocument() {
HTMLDocument doc = (HTMLDocument) super.createDefaultDocument();
doc.setAsynchronousLoadPriority(-1);
// 自定义解析器处理脚本
doc.setParser(new HTMLParser() {
@Override
public void parse(Reader r, HTMLDocument.HTMLReader callback,
boolean ignoreCharSet) throws IOException {
// 自定义解析逻辑,跳过脚本
}
});
return doc;
}
}
安全建议
// 清理用户输入的 HTML
public static String sanitizeHtml(String html) {
// 移除脚本标签
html = html.replaceAll("(?i)<script[^>]*>.*?</script>", "");
// 移除事件处理器
html = html.replaceAll("(?i)\\son\\w+\\s*=\\s*\"[^\"]*\"", "");
html = html.replaceAll("(?i)\\son\\w+\\s*=\\s*'[^']*'", "");
return html;
}
- JEditorPane + HTMLEditorKit 不支持脚本执行
- 脚本标签会被静默忽略
- 需要脚本功能时,使用
WebView(JavaFX)或ScriptEngine - 安全考虑:永远不要信任用户输入的 HTML,需要进行清理
如果你需要实现特定的 HTML 渲染功能,建议根据需求选择合适的工具。