Grails 4.0.11版本下GSP页面原始HTML过度编码问题咨询
问题原因
这个是Grails 4.0.4及后续4.x版本的已知配置加载优先级问题,不少跨版本升级的用户都遇到过相同现象,不属于配置填写错误,确实是未完全明记在官方版本说明里的隐性变更:
- 4.0.4版本调整了fat jar运行时的配置加载顺序,
grails-web-gsp依赖包内置的默认编码配置优先级,会高于项目中application.groovy/application.yml里的自定义GSP编码配置 - 开发模式
run-app运行时,加载顺序优先读取项目本地配置,所以你写的codec="none"规则可以正常生效,没有过度编码问题
修复方案
方案1:启动时追加参数(无需修改代码)
运行jar包时追加GSP编码的系统参数即可:
java -Dgrails.views.gsp.codecs.expression=none -Dgrails.views.gsp.codecs.scriptlets=none -Dgrails.views.gsp.codecs.taglib=none -jar 你的应用包名.jar
方案2:代码层面固定配置(一劳永逸)
在项目grails-app/conf/spring/resources.groovy中手动覆盖视图解析器的编码配置,优先级高于依赖包默认配置:
import org.grails.web.servlet.view.GroovyPageViewResolver beans = { groovyPageViewResolver(GroovyPageViewResolver) { expressionCodec = 'none' scriptletCodec = 'none' taglibCodec = 'none' staticPartsCodec = 'none' } }
重新打包后运行就会正常解析原始HTML内容,不需要修改现有GSP页面代码。
临时兼容方案
如果暂时不想改配置,可以在GSP中输出HTML的表达式外层套raw()函数,强制跳过编码:
${raw(你的HTML内容变量)}
这个方案只适合临时测试,不建议全项目大范围使用。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

