如何在tomcat自定义阀中访问用户主体

时间:2018-09-07 05:10:39

标签: java tomcat

请帮助我处理以下项目:

  1. 在哪里使用完全定制的阀代替过滤器?
  2. 在我们的应用程序中,我创建了tomcat 9自定义阀,并尝试从该阀访问用户主体。但在阀门中,它返回null。但我们可以从过滤器访问。我们使用了基于表单的身份验证。
  3. “用户主体”将在“自定义阀门”中可用,还是在fliter中可用?

下面提供了代码段:

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();
}
}   

预先感谢

1 个答案:

答案 0 :(得分:0)

您可以将阀门视为过滤器的等效物,但可以认为是服务器端,而不是应用程序端。例如。您需要将阀门部署到服务器,并且通常无法在不重新启动服务器的情况下热部署它的新版本。您可以通过重新部署包含过滤器的应用程序来重新部署过滤器。

Valve和Filter都是顺序敏感的:当您使用Valves(tomcat使用它们进行服务器端身份验证)并且您确定用户已通过身份验证,但您没有获得主体时,您的Valve似乎是在tomcat的验证阀之前运行。您可以确保按正确的顺序配置阀门,或将实现转移到过滤器,因为过滤器总是在所有阀门运行后 运行。

原则上,它们非常相似。过滤器是由servlet规范定义的,而Valves(属于服务器实现的一部分)是由Tomcat定义的。