集成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
相关产品推荐
相关产品推荐

