0

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

我正在考虑使用一个实现 HttpSessionListener 的类(覆盖 sessionCreated(final HttpSessionEvent se) 和 sessionDestroyed(final HttpSessionEvent se))但是在这些方法上我无法访问请求(我可以从中提取用户的日志名和上下文他访问)。

欢迎任何建议。

4

1 回答 1

2

我认为 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 教程部分

于 2013-04-01T12:36:42.077 回答