请帮助我以下项目:
在哪里使用完全定制的阀代替过滤器?
在我们的应用程序中,我创建了tomcat 9定制阀,并尝试从该阀访问用户主体。但在阀门中,它返回null。但我们可以从过滤器访问。我们使用了基于表单的身份验证。
用户主体将在“自定义”阀门中可用,还是在过滤中可用?
下面提供了代码段:
public class ContextInitializerValve extends ValveBase {
public ContextInitializerValve() {
System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
}
@Override
public void invoke(Request request, Response response) throws IOException, ServletException {
System.out.println("======================custom valve==============================");
Principal principal = request.getUserPrincipal();
}
}
提前致谢
最佳答案
您可以将阀门视为过滤器的等效物,但可以认为是服务器端的,而不是应用程序端的。例如。您需要将阀门部署到服务器上,并且通常无法在不重新启动服务器的情况下热部署它的新版本。您可以通过重新部署包含过滤器的应用程序来重新部署过滤器。
Valve和Filters都是顺序敏感的:当您使用Valves(tomcat使用它们进行服务器端身份验证)并且您确定用户已通过身份验证,但是您没有获得主体时,您的Valve似乎在tomcat的身份之前运行认证阀。您可以确保按正确的顺序配置阀门,也可以将实施方案移至过滤器,因为过滤器始终在所有阀门运行后运行。
原则上,它们非常相似。过滤器是由servlet规范定义的,而Valves(属于服务器实现的一部分)是由Tomcat定义的。
关于java - 如何在tomcat自定义阀门中访问用户主体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52215671/