Struts2升级至2.5.27后Struts Jquery Grid动态id赋值失效问题
问题诱因
该问题是Struts2版本迭代的安全规则调整和第三方插件适配不匹配共同导致的:
- Struts2 2.5.23及以上版本(包含你升级的2.5.27)为修复DOM属性注入类安全漏洞,调整了UI标签的属性求值逻辑:仅对标签定义中显式标记为动态可求值的属性,才会解析OGNL表达式,其余属性默认仅接受静态字符串赋值。
- id属于标签全局通用属性,默认被纳入静态赋值限制范围,而caption、gridModel、href等业务属性,在标签定义中原本就被标记为动态属性,所以不受影响。
- 你使用的
struts2-jquery-grid-plugin-4.0.3.jar版本适配的是Struts2 2.5.22及更早版本,没有针对新的规则将grid标签的id属性声明为动态可求值,因此动态赋值逻辑失效。你给出的代码:
<sjg:grid id="%{#tabGrid.gridId}" caption="%{#tabGrid.gridCaption}" gridModel="%{#tabGrid.gridData}" href="%{gridUrl}">
在2.5.22版本下符合规则可正常运行,版本升级后仅id属性受新规则限制失效。
可行解决方案
以下方案按改动量从小到大排序:
- 方案一:升级struts2-jquery系列插件到适配版本。将struts2-jquery-plugin和struts2-jquery-grid-plugin同步升级到4.1.0及以上版本,该版本已适配Struts2 2.5.23+的属性规则,原有业务代码无需任何修改即可恢复id动态赋值逻辑。
- 方案二:自定义扩展grid标签。继承官方SJG Grid标签实现类,给id属性的setter方法加上
@Dynamic注解,同步新增自定义标签的tld配置文件将id属性的rtexprvalue设为true,业务代码仅需将原本的<sjg:grid替换为自定义标签前缀即可,无需修改任何属性逻辑。 - 方案三:兼容层包裹适配。在
<sjg:grid>标签外层新增一个普通div标签,将动态id赋值给外层div,原有JS逻辑通过外层id查找内层grid实例即可,仅需要修改依赖grid id的JS查询逻辑,无需调整业务功能代码。
内容的提问来源于stack exchange,提问作者user9404194
相关产品推荐
相关产品推荐

