2009-11-12 2 views
2

Мне нужно знать, когда tomcat принимает логин, используя аутентификацию в режиме реального времени для данного контекста. Я смотрел доступные слушатели (ServletContextListener и ServletContextAttributeListener), но не могу понять, как получать уведомления при входе в систему. Это также должно работать при использовании однократного входа tomcat для нескольких контекстов. Есть идеи?Слушайте события аутентификации домена tomcat

ответ

7

К сожалению, нет стандартного/абстрактного способа привязки к нему с использованием 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); 
} 
+0

Это похоже на то, что мне нужно. Как насчет выхода из системы? возможно, глядя на событие окончания сеанса? – rmarimon

+0

Если '' HttpSession # invalidate() 'используется для выхода из системы, то вы действительно можете подключиться к' HttpSessionListener # sessionDestroyed() 'и проверить, есть ли атрибут' user'. – BalusC

+0

Я использовал 'httpRequest.getSession (false)', чтобы предотвратить расточительное создание сеанса. –

1

Если у вас есть доступ к конфигурации сервера, попробуйте написать LifecycleListener (http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/catalina/LifecycleListener.html), которые настроены на сервере (см. Файлы конфигурации сервера tomcat для вашей версии).

Не уверен, что это будет трюк или нет, но хорошее место для проверки.

Удачи.

Смежные вопросы