请帮助我以下项目:


在哪里使用完全定制的阀代替过滤器?
在我们的应用程序中,我创建了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/

10-10 14:51