JSP异常问题:CSS未生效反而被直接打印
问题:JSP页面直接打印CSS代码,表格未应用样式
问题分析
从提供的JSP代码来看,核心问题集中在两个关键点:
- 报告内容通过
<%= CustomValidator.cleanString(mapReport.getReport()) %>直接输出在<table>标签内部,如果mapReport.getReport()返回的内容包含CSS代码(比如<style>块),浏览器会将其视为普通文本渲染,而非样式规则。 CustomValidator.cleanString()方法可能对HTML标签过度转义,把CSS相关标签(如<style>)转成了实体字符(比如<style>),导致样式代码直接显示在页面上。
解决方案
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"> </td> <td width="909" height="22" colspan="2"> </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
相关产品推荐
相关产品推荐

