跟踪Java EE中的用户活动

时间:2013-04-01 11:11:28

标签: java session java-ee

我想跟踪用户的会话。我有兴趣获取用户登录名,他访问的上下文以及他访问某个上下文的时间。

我正在考虑使用一个实现HttpSessionListener的类(重写sessionCreated(最终的HttpSessionEvent se)和sessionDestroyed(最终的HttpSessionEvent se))但是在这些方法上我无法访问请求(从那里我可以拉出用户的他访问的logname和context。)。

欢迎任何建议。

1 个答案:

答案 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() {
    }
}

另请参阅:JavaEE6 tutorial section about filters