Scala 2.13.8与Play 2.5.0环境下记录入站请求及处理414 URI过长错误并打印对应URI的方法
Scala 2.13.8与Play 2.5.0环境下记录入站请求及处理414 URI过长错误并打印对应URI的方法
嗨,我来帮你搞定这个问题!在Play 2.5.x版本里,当URI过长触发414错误时,默认情况下请求可能还没走到你的业务代码就被底层服务器(比如Netty)拦截了,所以得从过滤器(Filter)或者服务器配置这两个方向入手,下面给你详细拆解可行方案:
方案一:自定义Filter捕获并记录触发414的URI
Play的Filter机制可以在请求进入路由前/后统一处理请求和响应,咱们可以通过它来捕获所有请求的URI,哪怕是触发414的请求也能记录下来:
- 创建自定义Filter类:
import javax.inject.Inject import play.api.mvc._ import play.api.Logger import scala.concurrent.{ExecutionContext, Future} class RequestLoggingFilter @Inject()(implicit ec: ExecutionContext) extends Filter { private val logger = Logger(this.getClass) override def apply(nextFilter: RequestHeader => Future[Result]) (requestHeader: RequestHeader): Future[Result] = { // 先记录所有入站请求的URI(包括超长的) logger.info(s"Incoming request URI: ${requestHeader.uri}") nextFilter(requestHeader).map { result => // 如果响应是414错误,单独打一条警告日志 if (result.header.status == 414) { logger.warn(s"Received HTTP 414 URI Too Long for URI: ${requestHeader.uri}") } result } } }
- 注册这个Filter:
在application.conf里添加配置,让Play加载你的过滤器:
play.http.filters = "com.yourpackage.RequestLoggingFilter"
注意哦:这个方案能记录所有请求的URI,但如果URI超长到被Netty直接拦截,那请求根本到不了Filter,这时候就得用方案二调整服务器配置了。
方案二:调整服务器最大URI长度,让请求进入业务代码
Play 2.5默认使用Netty作为底层服务器,Netty对请求行(包括URI)的长度有默认限制,咱们可以在application.conf里修改这个限制,让超长URI的请求能进入你的代码,这样你就能在控制器或者过滤器里打印它:
添加以下配置到application.conf:
# 调整Netty允许的请求行最大长度(单位:字节),默认是4096,这里改成8192可以容纳更长的URI play.server.netty.maxInitialLineLength = 8192
调整完配置后,重启应用,这时候超长URI的请求就会进入你的Filter或者控制器,你可以直接通过request.uri获取并打印。
⚠️ 小提醒:调大这个值要权衡安全风险,过长的URI可能被用于DoS攻击,建议根据你的业务场景设置合理的最大值,不要盲目调得太大。
额外小技巧
如果只是想临时调试,也可以在Play的日志配置里开启Netty的调试日志,不过这个日志会比较杂,不太推荐长期使用:
logger.play.server.netty = DEBUG
备注:内容来源于stack exchange,提问作者muhammed ozbilici
相关产品推荐
相关产品推荐

