5.3 KiB
5.3 KiB
代码审查报告
文件: data\demo-pmd\src\jsp\DemoJsp.jsp
语言: html
耗时: 239.9s
分析工具: jsp
总计: 17 | 错误: 6 | 警告: 10 | 建议: 1
静态分析 · 12 个问题
- 🔴
eslint:no-unused-varsL18 第 18 行:'init' 已定义但从未使用。 建议: 若该函数用于页面初始化,应显式绑定 window.addEventListener('load', init); 否则删除整个 init 函数。 - 🔴
eslint:no-varL19 第 19 行:不允许使用 var,请改用 let 或 const。 建议: x 声明后未再被赋值,应使用 const x = 1; 代替 var x = 1;。 - 🔴
eslint:no-undefL20 第 20 行:'alert' 未定义。 建议: 在浏览器环境应使用 window.alert(x); 更明确;也可以添加 /* global alert */ 注释作为全局声明。 - 🔴
pmd:NoClassAttributeL37 第 37 行:不要使用名为 class 的属性。 建议: 将 class="highlight" 改为 id="highlight"(并确保页面内 id 唯一),在外部 CSS 中使用 #highlight 定义样式。 - 🟡
pmd:NoScriptletsL11 第 11 行:JSP 文件中应避免使用 scriptlet(Java 脚本片段)。 建议: 将脚本片段改为 JSTL/EL 表达式,例如输出“Hello <c:out value="${param.name}"/>”,业务逻辑应放在控制器或后台 Bean 中;并记得声明 JSTL taglib。 - 🟡
pmd:LocalVariableCouldBeFinalL12 第 12 行:局部变量 'name' 可声明为 final。 建议: 将 String name 改为 final String name = request.getParameter("name"); 更推荐移除 scriptlet,使用 <c:out value="${param.name}"/> 输出。 - 🟡
pmd:NoInlineScriptL17 第 17 行:不要将 JavaScript 内容内联在 JSP/HTML 中。 建议: 将脚本移到独立的 .js 文件,例如 src="js/init.js",然后通过 <script src="js/init.js"></script> 引入;不要使用内联 script 块。 - 🟡
pmd:NoInlineStyleInformationL25 第 25 行:避免在 JSP 文件中包含样式信息()。 建议: 移除 align 属性,改用外部 CSS,例如
,并在 CSS 中定义 #center-aligned { text-align: center; }。
- 🟡
pmd:NoInlineStyleInformationL25 第 25 行:避免在 JSP 文件中包含样式信息( 加粗标签)。 建议: 用语义化的 Bold inline style 代替 ,或使用 CSS font-weight 设置加粗。 - 🟡
pmd:NoInlineStyleInformationL25 第 25 行:避免在 JSP 文件中包含样式信息()。 建议: 将颜色样式移到外部 CSS,例如改为 Font inline style,并在 CSS 中定义 #font-inline-style-demo { color: red; }。 - 🟡
pmd:DontNestJsfInJstlIterationL33 第 33 行:不要在会遍历 body 的 JSTL 迭代标签内嵌套 JSF 组件。 建议: 若迁移到 Facelets,使用 <ui:repeat value="#{items}" var="item"> 替代 c:forEach;否则请避免在 JSP 中混用 JSF 组件与 JSTL 迭代生命周期。 - 🟡
pmd:DuplicateJspImportsL42 第 42 行:java.util.List 被重复导入。 建议: 删除其中一个重复的 <%@ page import="java.util.List" %>,只保留一条导入语句。
AI 审查 · 5 条建议
- 🔴 [AI] [security]
reflected-xssL13 反射型 XSS:用户参数未编码直接输出 request.getParameter("name") 由用户控制,脚本中通过 out.println("Hello " + name) 直接拼入 HTML;当 name 含 <script>alert(document.cookie)</script> 等载荷时会被浏览器执行。 建议: 移除 scriptlet,改用 <c:out value="${param.name}"/> 或 OWASP Java Encoder 对输出做 HTML 实体编码,杜绝 XSS。 - 🔴 [AI] [bug]
missing-taglib-declarationL32 缺少 JSTL/JSF 标签库声明 页面第 32-33 行使用了 <c:forEach> 与 <h:outputText>,但没有任何 <%@ taglib %> 指令声明 c 和 h 前缀;JSP 容器无法解析这些标签,会导致编译失败或运行时错误。 建议: 在页面顶部增加 JSTL Core 和 JSF HTML 标签库的 taglib 指令,命名空间 URI 根据实际 JSTL/JSF 版本调整。 - 🟡 [AI] [style]
inline-style-attributeL26 第 26 行存在未标记的内联样式属性将样式写在 JSP 页面中,虽然 PMD 结果只标记了第 25 行的样式,但第 26 行同样违反内联样式外置的原则,也会增加维护成本。 建议: 移除 style 属性,将颜色样式写到外部 CSS 文件,例如Inline style,并在 CSS 中定义 #inline-style-demo { color: red; }。 - 🟡 [AI] [bug]
jsf-el-value-expressionL33 JSF 组件值表达式应使用 #{} 而不是 ${} 第 33 行 <h:outputText value="${item}"/> 在 JSF 组件中使用了 JSP EL ${}。JSF 的 ValueExpression 应使用 #{} 延迟求值,否则可能被当作普通字符串/文本解析,或无法正确解析 c:forEach 暴露的变量。 建议: 改为 <h:outputText value="#{item}"/>;若配合修复 DontNestJsfInJstlIteration,把外层 c:forEach 替换为 Facelets 的 ui:repeat。 - 🔵 [AI] [design]
incomplete-html5-documentL5 HTML5 文档缺少 DOCTYPE 与 lang 属性 <html> 没有前置 ,也没有 lang 属性,可能导致浏览器以怪癖模式渲染,同时影响屏幕阅读器/SEO 对页面语言的识别。 建议: 在 <html> 前添加 ,并设置 <html lang="zh-CN">(按实际内容语言调整)。