【发布时间】:2009-11-12 17:45:24
【问题描述】:
我需要知道 tomcat 何时接受对给定上下文使用域身份验证的登录。我一直在查看可用的侦听器(ServletContextListener 和 ServletContextAttributeListener),但不知道如何在登录时收到通知。当对多个上下文使用 tomcat 单点登录时,这也应该有效。有什么想法吗?
【问题讨论】:
标签: java authentication tomcat
我需要知道 tomcat 何时接受对给定上下文使用域身份验证的登录。我一直在查看可用的侦听器(ServletContextListener 和 ServletContextAttributeListener),但不知道如何在登录时收到通知。当对多个上下文使用 tomcat 单点登录时,这也应该有效。有什么想法吗?
【问题讨论】:
标签: java authentication tomcat
不幸的是,没有标准/抽象的方法可以使用 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) 来防止浪费的会话创建。
如果您有权访问服务器配置,您可以尝试编写一个 LifecycleListener (http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/LifecycleListener.html),它与服务器一起配置(请参阅您的版本的 tomcat 服务器配置文档)。
不确定它是否可以解决问题,但这是一个检查的好地方。
祝你好运。
【讨论】: