当前位置: 首页 > 面试题库 >

在Web应用程序中记录用户活动

长孙智刚
2023-03-14
问题内容

我希望能够在Web应用程序中记录用户活动。我目前正在使用log4j,它对于记录错误等非常有效,但是我不确定记录用户,执行的servlet方法和方法参数的最佳方法是什么。我正在使用Spring
Security进行身份验证。

典型的servlet可能看起来像:

public class BankAccountServlet {
    @RequestMapping("/deposit")
    public void deposit(double amount) {
        ...
    }

    @RequestMapping("/checkBalance")
    public double checkBalance() {
        ...
    }
}

如果有两个用户foo和bar,则foo检查他的余额,bar存入两个现金10.00和5.00。我希望日志看起来像:

01/01/1970 23:59:59 - foo - checkBalance
02/01/1970 23:59:59 - bar - deposit - 10.00
02/01/1970 23:59:59 - bar - deposit - 5.00

如果有人可以提供一些建议,我将非常感谢他们的帮助。


问题答案:

使用Log4J内置的MDC / NDC功能实际上非常简单(SLF4J和Logback仅支持MDC)。

实施MDC过滤器

首先,实现一个Servlet过滤器,该过滤器会将用户名添加到MDC /
NDC。Logback提供了便利的MDCInsertingServletFilter,Spring框架还向存储添加了Log4jNestedDiagnosticContextFilter。查看它们,但是您将需要一个这样的自定义对象:

public class UserToMdcFilter implements javax.servlet.Filter
{
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        MDC.put("user", SecurityContextHolder.getContext().getAuthentication().getPrincipal());
        try {
            chain.doFilter(request, response);
        } finally {
            MDC.remove("user");
        }
    }

    //...
}

将MDC值添加到您的日志记录模式

确保web.xml在Spring安全过滤器之后应用此过滤器。MDC功能非常出色-
如果需要,它将把保存在MDC线程本地映射中的所有值添加到每个日志记录语句中。就您而言,只需添加以下内容:

%X{user}

到您的日志记录模式。

不干扰日志记录方法的参数/值

记录方法的名称,参数和返回值由您决定(用户名将自动添加),但是有一些优雅的方法可以完全删除样板记录代码。试试这个Spring内置方面:

<bean id="customizableTraceInterceptor" class="org.springframework.aop.interceptor.CustomizableTraceInterceptor">
    <property name="enterMessage" value="Entering $[methodName]($[arguments])"/>
    <property name="exitMessage" value="Leaving $[methodName](): $[returnValue]"/>
</bean>
<aop:config>
    <aop:advisor advice-ref="customizableTraceInterceptor" pointcut="execution(public * BankAccountServlet.*(..))"/>
</aop:config>

最后的想法

  • 查看此线程:http : //forum.springsource.org/showthread.php?88890-MDC-Log4j-Filter-with-Spring-Security-3.0.2
  • 考虑将Logback用作日志记录库,并坚持使用SLF4J API。


 类似资料:
  • 我对多租户非常陌生。我们有一个基于Java、Spring、Hibernate/JPA等的应用程序,它不支持多租户。 现在,我们要将该应用程序转换为多租户应用程序。我读过关于多租户的文章,甚至用独立的模式方法编写了一个独立的应用程序。链接指的是这里。 我想到了日志部分,现在肯定会改变,因为日志文件现在将按租户(客户端)维护。因此,对于每个租户,将有一个单独的日志文件。此外,另一个租户不应访问特定租户

  • 本文向大家介绍如何使用户登录离线Web应用程序?,包括了如何使用户登录离线Web应用程序?的使用技巧和注意事项,需要的朋友参考一下 在在线登录时,您首先需要针对服务器进行身份验证,如果可以,请在数据库中存储用户名和哈希密码。 如果可以在数据库中找到该帐户,则仅当用户自上次登录以来已更改密码时,才需要生成一个新的哈希。 您还需要针对本地数据库进行身份验证。使用该应用的在线版本至少登录一次。

  • 在99%的情况下,当SQL server返回意外错误或文件系统中缺少文件时,我不能做任何合理的事情,我只想记录这种情况并将错误返回给用户。所以我看不出有什么理由应该返回“err”手动展开堆栈,实际上我会丢失stacktrace和上下文,并且更难找到错误的原因。 有没有什么我错过了,所以这种方法不会很好地工作?似乎大多数Go文章都建议不要使用panic/recover,但我不明白为什么。它看起来非常

  • 问题内容: 我已经使用基于标准的基于wildfly的Keycloak适配器的Keycloak保护了企业应用程序。我面临的问题是,其余的Web服务在被调用时需要知道当前登录的用户名。如何从Keycloak获取登录的用户信息? 我尝试使用,等等。但是没有一个能够提供所需的详细信息。 问题答案: 您从安全上下文中获取所有用户信息。 例: 为了传播安全上下文,您必须具有如下配置的安全域: JBoss /

  • 问题内容: 有一个包含两列的表:和。桌子上有关于。数据库是。 要求是开发一个连接到该数据库的简单Java EE应用程序,该应用程序允许用户通过遵循特定的URL 下载所有值。 如果我们将所有值组合成一个大块,然后将它们连接在一起(所有值之间用逗号分隔),然后将其发送给用户,这听起来是一个合适的解决方案吗? 该应用程序不是公开的,将由有限号使用。人。 问题答案: 最好的选择是 不要 以任何方式将数据存

  • 我在我的Web应用程序中配置了log4j2,它将调试/信息消息记录到控制台。我想使用记录器将每个超文本传输协议请求中收到的特定字段写入新文件。我明白添加一个文件附加到现有的文件将写入配置日志记录的所有日志消息,但是我想使用这个新的记录器只写入特定的字段。 我想rollingfile appender会有所帮助,它会为每个请求创建一个新文件,并将收到的一些输入字段保存为该请求的一部分。 非常感谢。