Servlet间请求转发是否会经过Tomcat定义的Valve及认证Valve识别规则
问题解答
1. Servlet转发请求是否会经过Authenticator Valve
默认情况下不会触发,原因如下:
- Tomcat的Valve是绑定在容器(Engine/Host/Context)的管道(Pipeline)中执行的,仅当客户端发起的外部请求首次进入对应容器时,才会执行完整的管道链,包括身份认证类Valve。
- Servlet内部转发(即调用
request.getRequestDispatcher().forward()的场景)属于同一请求在当前上下文内部的资源跳转,不会重新触发Context层级的管道执行逻辑,因此你定义的Authenticator Valve不会被调用。 - 例外情况:如果你的Valve配置在
(单Servlet层级),或者是用客户端重定向 sendRedirect跳转(本质是发起新的外部请求),才会重新走Valve执行逻辑。
2. Tomcat识别身份认证Valve的逻辑
Tomcat通过接口实现判定身份认证Valve:
- 所有身份认证类Valve都要求实现
org.apache.catalina.Authenticator接口,你自定义的Authenticator Valve只要实现该接口,Context容器启动时扫描管道下的Valve列表,就会自动把实现了该接口的实例识别为认证器,赋值给Context的authenticator属性,请求处理需要做身份校验时就会调用对应逻辑。 - 如果你在web.xml或Context配置的
<login-config>标签中指定了认证方式,Tomcat也会自动匹配对应内置的Authenticator实现,比如BASIC认证对应BasicAuthenticator、FORM认证对应FormAuthenticator。
内容的提问来源于stack exchange,提问作者Vishwa A
相关产品推荐
相关产品推荐

