Tomcat7配置HttpHeaderSecurityFilter后JasperReport PDF显示异常求助
问题解决思路与方案
你的思路完全正确——HttpHeaderSecurityFilter会对所有请求添加安全响应头,但JasperReport生成的PDF是二进制流,这类安全头不仅对它无效,反而可能干扰浏览器识别内容类型,导致显示为乱码二进制。将/report/**路径加入拦截例外是正确的解决方向。
XML配置方案(快速适配原有配置)
虽然你更擅长Java配置,但如果需要基于现有web.xml修改,只需给HttpHeaderSecurityFilter添加排除路径参数:
<filter> <filter-name>httpHeaderSecurity</filter-name> <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class> <!-- 新增排除路径配置 --> <init-param> <param-name>excludePatterns</param-name> <param-value>/report/**</param-value> </init-param> </filter> <filter-mapping> <filter-name>httpHeaderSecurity</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
excludePatterns支持Ant风格路径,多路径用逗号分隔。
Java配置方案(推荐,契合你的技术偏好)
用Spring的Java配置替代web.xml中的Filter注册,灵活性更高:
1. 注册Filter并指定排除路径
创建配置类,通过FilterRegistrationBean来管理HttpHeaderSecurityFilter:
import org.apache.catalina.filters.HttpHeaderSecurityFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SecurityFilterConfig { @Bean public FilterRegistrationBean<HttpHeaderSecurityFilter> httpHeaderSecurityFilter() { FilterRegistrationBean<HttpHeaderSecurityFilter> registrationBean = new FilterRegistrationBean<>(); HttpHeaderSecurityFilter filter = new HttpHeaderSecurityFilter(); // 设置要排除的路径 filter.setExcludePatterns("/report/**"); registrationBean.setFilter(filter); // 拦截所有路径(排除路径会自动跳过) registrationBean.addUrlPatterns("/*"); // 调整Filter执行顺序,确保优先于业务Filter(按需修改) registrationBean.setOrder(1); return registrationBean; } }
2. 关键注意事项
- 若原有web.xml中已配置HttpHeaderSecurityFilter,需移除该配置,避免重复拦截。
- 验证生效情况:查看PDF请求的响应头,确认没有HttpHeaderSecurityFilter添加的安全头(如
X-Frame-Options、X-XSS-Protection),同时浏览器能正确识别Content-Type: application/pdf。 - 若问题仍存在,检查JasperReport的响应是否正确设置了
Content-Disposition头(如attachment; filename=report.pdf),确保二进制流未被额外编码处理。
内容的提问来源于stack exchange,提问作者epiziv
相关产品推荐
相关产品推荐

