【问题标题】:Listen to tomcat realm authentication events监听 tomcat 域认证事件
【发布时间】:2009-11-12 17:45:24
【问题描述】:

我需要知道 tomcat 何时接受对给定上下文使用域身份验证的登录。我一直在查看可用的侦听器(ServletContextListener 和 ServletContextAttributeListener),但不知道如何在登录时收到通知。当对多个上下文使用 tomcat 单点登录时,这也应该有效。有什么想法吗?

【问题讨论】:

    标签: java authentication tomcat


    【解决方案1】:

    不幸的是,没有标准/抽象的方法可以使用 Servlet API 来连接它。您需要编写应用服务器特定的逻辑或实现一个全局过滤器,它每次都检查HttpServletRequest#getUserPrincipal()。例如:

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
        HttpServletRequest request = (HttpServletRequest) req;
        Principal user = request.getUserPrincipal();
        HttpSession session = request.getSession(false);
    
        if (user != null && (session == null || session.getAttribute("user") == null)) {
            request.getSession().setAttribute("user", user);
    
            // First-time login. You can do your intercepting thing here.
        }
    
        chain.doFilter(req, res);
    }
    

    【讨论】:

    • 这看起来完全符合我的需要。注销怎么样?也许正在查看会话到期事件?
    • 如果HttpSession#invalidate()被用于注销,那么你确实可以钩住HttpSessionListener#sessionDestroyed(),并检查user属性是否存在。
    • 我使用httpRequest.getSession(false) 来防止浪费的会话创建。
    • 我不得不使用 Principal 而不是 UserPrincipal,但它的作用就像一个魅力!
    【解决方案2】:

    如果您有权访问服务器配置,您可以尝试编写一个 LifecycleListener (http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/LifecycleListener.html),它与服务器一起配置(请参阅您的版本的 tomcat 服务器配置文档)。

    不确定它是否可以解决问题,但这是一个检查的好地方。

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2013-12-03
      • 2015-06-23
      • 2020-06-25
      • 2011-10-07
      相关资源
      最近更新 更多