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

JSP异常问题:CSS未生效反而被直接打印

问题:JSP页面直接打印CSS代码,表格未应用样式

问题分析

从提供的JSP代码来看,核心问题集中在两个关键点:

  • 报告内容通过<%= CustomValidator.cleanString(mapReport.getReport()) %>直接输出在<table>标签内部,如果mapReport.getReport()返回的内容包含CSS代码(比如<style>块),浏览器会将其视为普通文本渲染,而非样式规则。
  • CustomValidator.cleanString()方法可能对HTML标签过度转义,把CSS相关标签(如<style>)转成了实体字符(比如&lt;style&gt;),导致样式代码直接显示在页面上。

解决方案

1. 分离CSS与表格内容

检查MtrMappingReport.buildReport()的实现逻辑:

  • 如果该方法生成的内容同时包含CSS样式和表格HTML,需要将CSS部分提取出来,放在页面的<head>区域,仅把表格结构部分输出到<table>内部。
  • 修改后的JSP示例:
<html>
<head>
<title>Report</title>
<link rel="stylesheet" type="text/css" href="lds.css">
<%-- 提取报告中的CSS部分放在head中 --%>
<%= mapReport.getReportCss() %>
</head>
<body>
<!-- begin of main area -->
<form method="post" action="" name="reportbuild">
<table width="995" height="211">
<%-- 仅输出表格结构内容 --%>
<%= CustomValidator.cleanString(mapReport.getReportTable()) %>
  <tr>
    <td width="700" height="26" valign="bottom">
      <input type="button" value=" Close " onClick="parent.window.close()" id="button1" name="button1">
    </td>
  </tr>
  <tr>
    <td width="76" height="22">&nbsp;</td>
    <td width="909" height="22" colspan="2">&nbsp;
    </td>
  </tr>
</table>
</form>
<!-- end of main area -->
</body>
</html>

2. 调整cleanString()的转义规则

如果cleanString()是为了防止XSS攻击,需要确保它不会转义合法的CSS/HTML标签:

  • 修改方法逻辑,仅转义危险的脚本标签(如<script>),保留样式相关标签。
  • Java代码示例调整:
public static String cleanString(String input) {
    // 仅过滤危险脚本标签,保留样式相关标签
    return input.replaceAll("<script[^>]*>.*?</script>", "")
                .replaceAll("<[^>]*on[^=]*=[^>]*>", "");
}

3. 验证外部CSS路径

确认lds.css的路径是否正确:

  • 如果JSP部署在Web应用的子目录下,使用绝对路径引用CSS文件,避免路径错误导致样式无法加载。
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/lds.css">

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:35:18