迁移至Play 2.6后Authorization响应头警告未消除的问题求助
我来帮你梳理下这个问题的解决思路,毕竟踩过类似的坑😉
问题核心
Play 2.6开始对HTTP响应头的合法性校验变得更严格,而Authorization头按照HTTP规范本来是请求头,出现在响应里会被判定为非法。你虽然设置了play.server.akka.illegal-response-header-value-processing-mode = ignore但没生效,再加上这个头是com.pauldijou" %% "jwt-play" % "0.16.0"自动添加的,就导致警告一直存在。
可行解决方案
优先升级jwt-play依赖版本
你用的0.16.0版本是比较老的,针对Play 2.6的适配可能有缺陷——毕竟官方issue里提到的修复,大概率是在后续版本里落地的。建议升级到适配Play 2.6的最新jwt-play版本(比如0.17.x系列,具体可以查下版本兼容表),新版本应该已经修复了“在响应中添加Authorization头”这个不符合规范的行为,从根源上解决问题。检查配置是否真正生效
有时候配置没生效不是参数错了,而是加载问题:- 确认
application.conf里的拼写完全正确:play.server.akka.illegal-response-header-value-processing-mode = ignore,注意大小写和连字符别写错; - 可以在应用启动时加个日志,读取这个配置值打印出来,确认它确实被设置成了
ignore,避免配置文件没被正确加载的情况。
- 确认
添加过滤器手动移除非法响应头
如果暂时没法升级依赖,就自己写个Play过滤器,在响应发送前把Authorization头删掉:import play.api.mvc._ import scala.concurrent.Future import scala.concurrent.ExecutionContext.Implicits.global class RemoveAuthHeaderFilter extends Filter { override def apply(next: RequestHeader => Future[Result])(req: RequestHeader): Future[Result] = { next(req).map { result => // 移除响应里的Authorization头 result.withHeaders(result.headers.filterNot(_._1.equalsIgnoreCase("Authorization"))) } } }然后在你的
ApplicationLoader或者配置里注册这个过滤器,让它在请求链路中生效。尝试配置Akka HTTP底层参数
Play 2.6基于Akka HTTP,有时候Play的配置可能没正确传递到底层。试试在application.conf里直接加上Akka HTTP的配置:akka.http.server.parsing.illegal-header-value-processing-mode = ignore双重配置一下,确保底层的校验规则也被设置为忽略。
内容的提问来源于stack exchange,提问作者pme

