我想跟踪用户的会话。我有兴趣获取用户登录名,他访问的上下文以及他访问某个上下文的时间。
我正在考虑使用一个实现HttpSessionListener的类(重写sessionCreated(最终的HttpSessionEvent se)和sessionDestroyed(最终的HttpSessionEvent se))但是在这些方法上我无法访问请求(从那里我可以拉出用户的他访问的logname和context。)。
欢迎任何建议。
答案 0 :(得分:2)
我认为servlet Filter更适合你想要的东西。我建议在您要跟踪的所有网址周围编写自定义过滤器。
在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() {
}
}