我想跟踪用户的会话。我对获取用户登录名、他访问的上下文以及他访问某个上下文的时间感兴趣。
我正在考虑使用一个实现 HttpSessionListener 的类(覆盖 sessionCreated(final HttpSessionEvent se) 和 sessionDestroyed(final HttpSessionEvent se))但是在这些方法上我无法访问请求(我可以从中提取用户的日志名和上下文他访问)。
欢迎任何建议。
我想跟踪用户的会话。我对获取用户登录名、他访问的上下文以及他访问某个上下文的时间感兴趣。
我正在考虑使用一个实现 HttpSessionListener 的类(覆盖 sessionCreated(final HttpSessionEvent se) 和 sessionDestroyed(final HttpSessionEvent se))但是在这些方法上我无法访问请求(我可以从中提取用户的日志名和上下文他访问)。
欢迎任何建议。
我认为 servlet Filter更适合您想要的。我建议围绕您要跟踪的所有 url 编写一个自定义过滤器。
在该doFilter()
方法中,您可以HttpServletRequest
根据需要访问。从请求对象中你也可以得到HttpSession
。
这是一个例子:
@WebFilter("/*")
public class TrackingFilter implements Filter {
private FilterConfig filterConfig;
@Override
public void init(FilterConfig config) throws ServletException {
this.filterConfig = config;
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpSession session = request.getSession(false);
String loggedInUser = "Unregistered user";
//assuming you have a session attribute named user with the username
if(session != null && session.getAttribute("user") != null) {
loggedInUser = (String) session.getAttribute("user");
}
Date accessedDate = new Date();
filterConfig.getServletContext().log(
String.format("%s accessed context %s on %tF %tT",
loggedInUser, request.getRequestURI() ,
accessedDate, accessedDate)
);
chain.doFilter(req, res);
}
@Override
public void destroy() {
}
}
另请参阅:关于过滤器的 JavaEE6 教程部分。