2012-11-21 2 views
3

Я создал перехватчик с помощью метода, аннотированного с помощью @AroundInvoke, для вызова методов журнала и связанных с ним таймингов. Это основано на Richard Hightowers отлично блог на КДИ АОПЕ http://java.dzone.com/articles/cdi-aop):Регистрация идентификатора сеанса пользователя с помощью перехватчика javax

@AroundInvoke 
public Object log(InvocationContext ctx) throws Exception { 
    Logger logger = Logger.getLogger(ctx.getTarget().getClass().getName()); 

    logger.trace("ENTERING : "+ctx.getMethod()); 

    long start = System.currentTimeMillis(); 

    Object returnMe = ctx.proceed(); 

    long executionTime = System.currentTimeMillis() - start; 

    logger.trace("EXITING : "+ctx.getMethod()+":"+executionTime+"ms"); 

    return returnMe; 
} 

Я хотел бы войти пользователь идентификатор сеанса, так что я могу легко проанализировать пути пользователей через приложение. Как получить доступ к сеансу пользователя?

Я посмотрел на инъекцию SessionContext, но не смог понять, как использовать API для извлечения этого значения.

Я просмотрел log4j MDC, но я надеялся избежать необходимости добавления фильтра сервлета.

+0

Вы используете только сервлеты + jsp или JSF? – dcernahoschi

+0

Мы используем JSF 2, EJB 3.1 и JPA 2 – Troup

+0

Итак, вам нужен идентификатор сеанса HTTP или идентификатор сеанса EJB? –

ответ

2

На самом деле, мой вопрос должен был быть «Как мне регистрировать вызовы методов таким образом, чтобы данный путь пользователей через приложение можно было легко проанализировать из файла журнала?». Вопрос как таковой предполагает получение идентификатора сеанса - это ответ, который, возможно, не так. С учетом этого более продуманного вопроса я обнаружил, что до тех пор, пока вся бизнес-логика, вызывающая озабоченность, доступна через EJB, вы можете зарегистрировать данный путь пользователей следующим образом:

Создайте класс перехватчика, который имеет EJB SessionContext, введенный в к нему:

/** 
* SessionContext of this EJB; this will be injected by the EJB 
* Container because it's marked w/ @Resource 
*/ 
@Resource 
private SessionContext context; 

Добавьте метод с аннотацией AroundInvoke, который будет перехватывать вызовы:

@AroundInvoke 
public Object log(InvocationContext ctx) throws Exception { 
    String originName = Thread.currentThread().getName(); 
    String currentUser = context.getCallerPrincipal().getName(); 
     try{ 
      String tracingName = currentUser + " " + originName; 
      Thread.currentThread().setName(tracingName); 
      return invocationContext.proceed(); 
     }finally{ 
      Thread.currentThread().setName(originName); 
     } 
    } 

Примечание мы используем контекст сеанса разжиться пользователя, вызвавшего это действие. Затем мы изменим имя потока, чтобы сохранить имя пользователя. Все последующие протоколирования в этом стеке вызовов будут выводить имя пользователя, при условии, что loggin настроен так, чтобы также выводить имя потока независимо от того, находятся ли они в EJB или просто в классе POJO.

Этого поток переименование был вдохновлен серверонезависимая нить Адама Biên в отслеживании утилиты:

http://www.adam-bien.com/roller/abien/entry/server_independent_thread_tracking_utility

Изменяя его переименовать нить, чтобы быть именами пользователей были модификацией я сделал.

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