gpt4 book ai didi

java - 通过 javax 拦截器记录用户的 session ID

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:55 25 4
gpt4 key购买 nike

我创建了一个拦截器,其方法带有 @AroundInvoke 注释,用于记录方法调用和相关计时。这是基于 Richard Hightowers 在 CDI AOP 上发表的优秀博客 http://java.dzone.com/articles/cdi-aop) :

@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;
}

我想记录用户的 session ID,以便我可以轻松地分析用户通过应用程序的路径。我如何掌握用户的 session ?

我查看了注入(inject) SessionContext 但看不到如何使用 API 提取此值。

我看过 log4j MDC,但我希望避免添加 servlet 过滤器的需要。

最佳答案

实际上,我的问题应该是“如何记录方法调用,以便可以轻松地从日志文件中解析出通过应用程序的给定用户路径?”。目前的问题假定获取 session ID 是答案,但事实并非如此。考虑到这个措辞更好的问题,我现在发现只要所有相关的业务逻辑都通过 EJB 访问,您确实可以按如下方式记录给定的用户路径:

创建一个注入(inject)了 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 ctx.proceed();
}finally{
Thread.currentThread().setName(originName);
}
}

请注意,我们使用 session 上下文来获取导致此操作的用户。然后我们更改线程的名称以保存该用户名。此调用堆栈中的所有后续日志记录都将输出用户名,假设 loggin 被配置为也输出线程名,而不管它们是在 EJB 中还是只是在某个 POJO 类中。

此线程重命名的灵感来自 Adam Bien 的服务器独立线程跟踪实用程序:

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

更改它以将线程重命名为用户名是我所做的修改。

关于java - 通过 javax 拦截器记录用户的 session ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13491235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com