JEditorPaneHTMLEditorKitScript脚本

wen java案例 2

本文目录导读:

JEditorPaneHTMLEditorKitScript脚本

  1. JEditorPane + HTMLEditorKit 的脚本支持
  2. 详细说明

我来详细说明一下 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;
}
  1. JEditorPane + HTMLEditorKit 不支持脚本执行
  2. 脚本标签会被静默忽略
  3. 需要脚本功能时,使用 WebView(JavaFX)或 ScriptEngine
  4. 安全考虑:永远不要信任用户输入的 HTML,需要进行清理

如果你需要实现特定的 HTML 渲染功能,建议根据需求选择合适的工具。

抱歉,评论功能暂时关闭!