73 lines
5.3 KiB
Markdown
73 lines
5.3 KiB
Markdown
# 代码审查报告
|
|
|
|
**文件:** `data\demo-pmd\src\jsp\DemoJsp.jsp`
|
|
**语言:** html
|
|
**耗时:** 239.9s
|
|
**分析工具:** jsp
|
|
|
|
---
|
|
|
|
总计: 17 | 错误: 6 | 警告: 10 | 建议: 1
|
|
|
|
静态分析 · 12 个问题
|
|
|
|
- 🔴 `eslint:no-unused-vars` L18
|
|
第 18 行:'init' 已定义但从未使用。
|
|
建议: 若该函数用于页面初始化,应显式绑定 window.addEventListener('load', init); 否则删除整个 init 函数。
|
|
- 🔴 `eslint:no-var` L19
|
|
第 19 行:不允许使用 var,请改用 let 或 const。
|
|
建议: x 声明后未再被赋值,应使用 const x = 1; 代替 var x = 1;。
|
|
- 🔴 `eslint:no-undef` L20
|
|
第 20 行:'alert' 未定义。
|
|
建议: 在浏览器环境应使用 window.alert(x); 更明确;也可以添加 /* global alert */ 注释作为全局声明。
|
|
- 🔴 `pmd:NoClassAttribute` L37
|
|
第 37 行:不要使用名为 class 的属性。
|
|
建议: 将 class="highlight" 改为 id="highlight"(并确保页面内 id 唯一),在外部 CSS 中使用 #highlight 定义样式。
|
|
- 🟡 `pmd:NoScriptlets` L11
|
|
第 11 行:JSP 文件中应避免使用 scriptlet(Java 脚本片段)。
|
|
建议: 将脚本片段改为 JSTL/EL 表达式,例如输出“Hello <c:out value="${param.name}"/>”,业务逻辑应放在控制器或后台 Bean 中;并记得声明 JSTL taglib。
|
|
- 🟡 `pmd:LocalVariableCouldBeFinal` L12
|
|
第 12 行:局部变量 'name' 可声明为 final。
|
|
建议: 将 String name 改为 final String name = request.getParameter("name"); 更推荐移除 scriptlet,使用 <c:out value="${param.name}"/> 输出。
|
|
- 🟡 `pmd:NoInlineScript` L17
|
|
第 17 行:不要将 JavaScript 内容内联在 JSP/HTML 中。
|
|
建议: 将脚本移到独立的 .js 文件,例如 src="js/init.js",然后通过 <script src="js/init.js"></script> 引入;不要使用内联 script 块。
|
|
- 🟡 `pmd:NoInlineStyleInformation` L25
|
|
第 25 行:避免在 JSP 文件中包含样式信息(<p align="center">)。
|
|
建议: 移除 align 属性,改用外部 CSS,例如 <p id="center-aligned">,并在 CSS 中定义 #center-aligned { text-align: center; }。
|
|
- 🟡 `pmd:NoInlineStyleInformation` L25
|
|
第 25 行:避免在 JSP 文件中包含样式信息(<b> 加粗标签)。
|
|
建议: 用语义化的 <strong>Bold inline style</strong> 代替 <b>,或使用 CSS font-weight 设置加粗。
|
|
- 🟡 `pmd:NoInlineStyleInformation` L25
|
|
第 25 行:避免在 JSP 文件中包含样式信息(<font color="red">)。
|
|
建议: 将颜色样式移到外部 CSS,例如改为 <span id="font-inline-style-demo">Font inline style</span>,并在 CSS 中定义 #font-inline-style-demo { color: red; }。
|
|
- 🟡 `pmd:DontNestJsfInJstlIteration` L33
|
|
第 33 行:不要在会遍历 body 的 JSTL 迭代标签内嵌套 JSF 组件。
|
|
建议: 若迁移到 Facelets,使用 <ui:repeat value="#{items}" var="item"> 替代 c:forEach;否则请避免在 JSP 中混用 JSF 组件与 JSTL 迭代生命周期。
|
|
- 🟡 `pmd:DuplicateJspImports` L42
|
|
第 42 行:java.util.List 被重复导入。
|
|
建议: 删除其中一个重复的 <%@ page import="java.util.List" %>,只保留一条导入语句。
|
|
|
|
AI 审查 · 5 条建议
|
|
|
|
- 🔴 [AI] [security] `reflected-xss` L13
|
|
**反射型 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-declaration` L32
|
|
**缺少 JSTL/JSF 标签库声明**
|
|
页面第 32-33 行使用了 <c:forEach> 与 <h:outputText>,但没有任何 <%@ taglib %> 指令声明 c 和 h 前缀;JSP 容器无法解析这些标签,会导致编译失败或运行时错误。
|
|
建议: 在页面顶部增加 JSTL Core 和 JSF HTML 标签库的 taglib 指令,命名空间 URI 根据实际 JSTL/JSF 版本调整。
|
|
- 🟡 [AI] [style] `inline-style-attribute` L26
|
|
**第 26 行存在未标记的内联样式属性**
|
|
<div style="color: red;"> 将样式写在 JSP 页面中,虽然 PMD 结果只标记了第 25 行的样式,但第 26 行同样违反内联样式外置的原则,也会增加维护成本。
|
|
建议: 移除 style 属性,将颜色样式写到外部 CSS 文件,例如 <div id="inline-style-demo">Inline style</div>,并在 CSS 中定义 #inline-style-demo { color: red; }。
|
|
- 🟡 [AI] [bug] `jsf-el-value-expression` L33
|
|
**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-document` L5
|
|
**HTML5 文档缺少 DOCTYPE 与 lang 属性**
|
|
<html> 没有前置 <!DOCTYPE html>,也没有 lang 属性,可能导致浏览器以怪癖模式渲染,同时影响屏幕阅读器/SEO 对页面语言的识别。
|
|
建议: 在 <html> 前添加 <!DOCTYPE html>,并设置 <html lang="zh-CN">(按实际内容语言调整)。
|