You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集成OWASP AntiSamy防XSS遇FileNotFoundError,求排查方案

解决AntiSamy策略文件FileNotFoundError问题

问题根源

你用File类加载antisamy-tinymce.xml的方式仅适用于磁盘文件系统,但项目打包为WAR/JAR后,src/main/resources下的文件会被嵌入到应用包内部,并非独立磁盘文件,因此File无法定位到它,部署后必然报错。

解决方案

改用类路径资源加载的方式,直接从应用的类路径中读取策略文件,这是Java Web项目加载资源的标准做法,本地开发和服务器部署都能正常工作。

方案1:通过类加载器获取资源流

修改代码如下:

// sanitize welcomeMessage
try {
    // 从类路径加载策略文件
    InputStream policyStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("antisamy-tinymce.xml");
    if (policyStream == null) {
        throw new FileNotFoundException("策略文件antisamy-tinymce.xml未在类路径中找到");
    }
    Policy policy = Policy.getInstance(policyStream);
    AntiSamy as = new AntiSamy();
    CleanResults cr = as.scan(welcomeMessage, policy);
    preferences.setWelcomeMessage(cr.getCleanHTML());
} catch (PolicyException | ScanException | IOException e) {
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Invalid Welcome Message", e.getMessage()));
    return;
}

方案2:使用Policy的类路径资源重载方法

AntiSamy的Policy类提供了直接通过类路径资源名加载的简化方法:

// sanitize welcomeMessage
try {
    // 直接指定类路径下的资源名
    Policy policy = Policy.getInstance("antisamy-tinymce.xml");
    AntiSamy as = new AntiSamy();
    CleanResults cr = as.scan(welcomeMessage, policy);
    preferences.setWelcomeMessage(cr.getCleanHTML());
} catch (PolicyException | ScanException e) {
    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Invalid Welcome Message", e.getMessage()));
    return;
}

额外验证步骤

  • 确认打包后的WAR/JAR中包含目标文件:解压包后检查WEB-INF/classes(WAR包)或根目录(JAR包)下是否存在antisamy-tinymce.xml。
  • 核对文件名拼写(注意大小写,Linux服务器对文件名大小写敏感)。

内容的提问来源于stack exchange,提问作者Gafar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:15:04