本文目录导读:

我来详细说明一下 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 渲染功能,建议根据需求选择合适的工具。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播