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

Struts2-core-2.5.30迁移至6.1.1遇CSP报错求助

问题根源与修正方案

1. Meta标签存在语法错误

你将Content-Type与Content-Security-Policy配置混在同一个meta标签中,这属于无效配置:

  • 原错误代码:
<meta http-equiv=content-type" content="script-src 'unsafe-inline'; script-src-elem 'http://localhost:8080/My_App/html/js/file.js'; text/html; charset=ISO-8859-1" />
  • 正确拆分写法:
<!-- 单独设置文档类型与编码 -->
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<!-- 单独配置内容安全策略 -->
<meta http-equiv="Content-Security-Policy" content="..." />

2. Struts 6.x内置CSP头覆盖了你的Meta配置

Struts 6.1.1默认启用内置CSP防护,会自动向响应头添加包含'nonce-xxx' 'strict-dynamic' http: https:的规则。浏览器会优先遵循响应头中的CSP,页面meta标签的配置因此被完全忽略,这也是你添加meta后仍报错的核心原因。

3. strict-dynamic导致主机白名单失效

当CSP规则包含strict-dynamic时,http: https:这类主机白名单会被禁用,仅信任由已授权脚本(带nonce标识的脚本)加载的资源。你直接引用的file.js不属于此类授权资源,因此被拦截。


具体修正步骤

方案一:关闭Struts自动CSP,自定义规则

若不需要Struts内置的CSP防护,可在struts.xml中关闭该功能:

<constant name="struts.security.csp.enabled" value="false" />

之后用正确的meta标签配置自定义CSP,例如允许内联脚本和指定域名的脚本:

<meta http-equiv="Content-Security-Policy" content="script-src 'unsafe-inline' http://localhost:8080; script-src-elem http://localhost:8080/My_App/html/js/file.js;" />

方案二:保留Struts内置CSP,适配规则

如果想保留Struts的安全防护,需做以下调整:

  1. 处理内联事件:内联事件(如onclick)无法通过哈希或nonce直接授权,需在CSP规则中添加'unsafe-hashes'并配合事件代码的哈希值;更推荐的方式是移除内联事件,将绑定逻辑移到带nonce属性的<script>标签中(Struts会自动为页面script标签注入正确的nonce值)。
  2. 加载外部脚本:将file.js改为由带nonce的脚本动态加载,或在Struts的CSP配置中添加该脚本的哈希值。可通过struts.security.csp.scriptSrc常量自定义规则:
<constant name="struts.security.csp.scriptSrc" value="'nonce-${nonce}' 'strict-dynamic' 'unsafe-hashes' sha256-xxx" />

(其中sha256-xxx是file.js文件内容的SHA-256哈希值,可通过命令行或在线工具生成)


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:10:28