java记录操作日志

2023-11-09

 记录:

   logPointCut 方法只是用于定义切点,指定了哪些方法会被拦截,而获取方法上的 OperateLog 注解是为了在切面逻辑中判断是否需要记录操作日志。这两者是配合使用的,前者确定拦截的位置,后者确定在拦截的位置上是否执行操作日志记录逻辑。

        //登陆操作日志
     // 解析用户代理字符串
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));

// 构建用户登录日志实体
UserLoginLogEntity logEntity = UserLoginLogEntity.builder()
    .userId(employeeDTO.getId()) // 设置用户ID
    .userName(employeeDTO.getActualName()) // 设置用户名
    .remoteIp(SmartIPUtil.getRemoteIp(request)) // 设置远程IP地址
    .remotePort(request.getRemotePort()) // 设置远程端口号
    .remoteBrowser(userAgent.getBrowser().getName()) // 设置远程浏览器
    .remoteOs(userAgent.getOperatingSystem().getName()) // 设置远程操作系统
    .loginStatus(JudgeEnum.YES.getValue()) // 设置登录状态
    .build();

// 添加登录日志
logService.addLog(logEntity);

二、加密解密

  1. 接收前端Base64加密的密码。
  2. 在后端进行一次Base64解码,得到原始密码。
  3. 使用你自己的加密方法(例如:SmartDigestUtil.encryptPassword)对原始密码进行加密。
  4. 使用这个加密后的密码和数据库中的密码进行比对。

 

// 第一步:Base64解码,得到原始密码
String decodedPassword = this.base64Decode(loginForm.getLoginPwd());

// 第二步:使用自己的加密方法进行加密
String encryptedPwd = null;
try {
    encryptedPwd = SmartDigestUtil.encryptPassword(CommonConst.Password.SALT_FORMAT, decodedPassword);
} catch (Exception e) {
    e.printStackTrace();
}

// 第三步:调用employeeDao的login方法进行登录验证,并将信息存储到employeeDTO中
EmployeeDTO employeeDTO = employeeDao.login(loginForm.getLoginName(), encryptedPwd);



    public static String encryptPassword(String salt, String password) {
        return SmartDigestUtil.md5Hex(String.format(salt, password));
    }

    public static final class Password {
        public static final String DEFAULT = "123456";
        public static final String SALT_FORMAT = "smart_%s_admin";
    }

1.测试

class LoginServiceTest {

    @Test//Base64解密
    void login() {
        BASE64Decoder decoder = new BASE64Decoder();
        String ji = base64Decode("MTIzNDU2");
        System.out.println(ji);


    }
    private  String base64Decode(String str){
        return new String(Base64.decodeBase64(str.getBytes()));
    }


    @Test//Base64加密
    void base64(){
        String originalText = "123456";
        
        byte[] encodedBytes = Base64.encodeBase64(originalText.getBytes());
        String encodedText = new String(encodedBytes);

        System.out.println("Encoded: " + encodedText);
    }

    @Test
    void test(){
        // 对密码进行md5加密
        BASE64Decoder decoder = new BASE64Decoder();
        String loginPwd = null;
        try {
            loginPwd = SmartDigestUtil.encryptPassword(CommonConst.Password.SALT_FORMAT, new String(decoder.decodeBuffer("123456")));
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(loginPwd);
    }
}

三、AOP

1.概念 

  • 切面(Aspect):切面是一个模块化的关注点,例如日志记录或事务管理。切面可以定义通知和切入点。

  • 通知(Advice):通知是切面的具体行为。通知定义了在特定的连接点执行的代码。主要类型有:

    • 前置通知(Before):在连接点之前执行。
    • 后置通知(After):在连接点之后执行。
    • 返回通知(After Returning):在连接点正常完成之后执行。
    • 异常通知(After Throwing):在连接点抛出异常后执行。
    • 环绕通知(Around):在连接点之前和之后执行。
  • 切入点(Pointcut):切入点定义了通知应该在何处应用。通过使用表达式或模式匹配,可以精确地指定在哪些方法、类或包上应用通知。

  • 连接点(Join Point):连接点是程序执行过程中的某个阶段,例如方法的调用或异常的抛出。通知会在这些点上被触发。

  • 织入(Weaving):织入是将切面与其他类型(如类和方法)结合在一起创建一个被通知的对象的过程。这可以在编译时、类加载时或运行时完成。

  • 目标对象(Target Object):目标对象是被一个或多个切面通知的对象。

  • 代理(Proxy):代理是一个被切面通知的对象。在运行时,AOP容器会为目标对象创建一个代理对象。

2.连接点的范围比切入点要大

完全正确。连接点的范围确实比切入点要大。

  • 连接点(Join Point):连接点是程序中所有可能的插入点,包括所有的方法调用、构造函数调用、异常抛出等。它代表了程序中所有可以插入附加行为(如日志记录、事务处理等)的地方。
  • 切入点(Pointcut):切入点则是从所有这些连接点中选择的一个子集。通过定义切入点,您可以精确地控制在哪些特定连接点上插入附加行为。

用一个简单的比喻来理解,可以把连接点看作是一本书中的所有单词,而切入点则是我选择的某些特定单词或短语。

在AOP的实际应用中,您可能不希望在每个连接点上都插入附加行为,因为这样可能会导致代码混乱和性能下降。通过定义切入点,您可以选择性地在特定连接点上插入附加行为,从而获得更精确的控制。

 

 自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface OperateLog {

    /* 类型,LOGIN-登录⽇志、OPERATION操作⽇志 */
    String type() default "";

    /* 日志内容 */
    String value() default "";

    /* 业务类型,业务⽅⾃⼰定义 */
    String businessType() default "";

    /* 登录用户类型 1 员工 2企业 3 会员(同up_sys_user)*/
    int loginType() default 1;
}

链接:

https://gitee.com/jiang2360/city-government

链接:

 

  1. blog.csdn.net - 记录操作日志(JAVA版某大厂基础实践) - CSDN博客
  2. blog.csdn.net - java操作日志实现_businesstype_丶雨果丶的博客-CSDN博客
  3. zhuanlan.zhihu.com - Java高手如何搭建高效易用的日志系统 - 知乎
  4. blog.csdn.net - 如何在 Java 中进行日志记录 - CSDN博客
  5. blog.csdn.net - JAVA记录操作日志步骤_java操作日志记录,包括成功和失败_Selegant的博客-CSDN博客
  6. zhuanlan.zhihu.com - Java 日志体系详解 - 知乎 - 知乎专栏
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java记录操作日志 的相关文章

  • 如何将未知列数的 ResultSet 映射到 List 并将其显示在 HTML 表中?

    我使用 Netbeans GlassFish 和 JavaDB 创建了一个数据库应用程序 现在我的控制器 Servlet 代码执行一些动态 SQL 查询并返回结果集 或者我可以更改 toString 现在 如何以表格格式显示返回的结果集 我
  • 如何将变量的全部内容发送/导出到文本文件/xml 文件/剪贴板?

    我想将实例的内容 最好以树形形式 发送给某人 打印屏幕是不行的 因为类太复杂了 您需要将输出转回实例吗 在这种情况下 其他答案都是正确的 如果您只想手动检查实例的内容 理想情况下您的类都将实现toString 你可以将其重定向到一个文件 如
  • ScheduledThreadPoolExecutor如何在特定时间运行任务?

    特别是 它是否像这样在内部实现了 while true 循环 while System currentTimeMillis lt timeToRunTask Thread sleep 1000 doTask From http grepco
  • 在命令行java中突出显示文本[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一项任务是重新创建 unix cal 程序 除了一部分之外 相当简单 今天 它突出显示了该数字 我不知道该怎么做 关于如何在 Ja
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • 如何将现有的 SQLite3 数据库导入 Room?

    好吧 我在桌面上使用 SQLite3 创建了一个只需要读取的某些信息的数据库 我正在制作的应用程序不需要在此表中插入或删除信息 我在 Room 数据库层上做了相当多的谷歌搜索 所有文档都需要在构建应用程序时在 Room 中创建一个新的数据库
  • JTextField 和 JTextArea

    JTextField 和 JTextArea 有什么不同 是否可以在一个班级中使用这两个班级 总之 JTextField 是单行文本字段 而 JTextArea 可以跨越多行 文档中清楚地解释了这些差异 文本区 http docs orac
  • 使用 JSch 分别为各个提示提供输入

    问题是 SSH 连接需要在常规登录后提供另一个用户 ID 和密码信息 我正在使用 JSch 连接到远程服务器 它接受以下形式的输入InputStream 和这个InputStream只能通过一次 由于会话是交互式的 这会导致问题 我尝试将输
  • OpenNLP 与斯坦福 CoreNLP

    我一直在对这两个包进行一些比较 但不确定该往哪个方向走 我简单地寻找的是 命名实体识别 人 地点 组织等 性别识别 一个不错的训练 API 据我所知 OpenNLP 和斯坦福 CoreNLP 提供了非常相似的功能 然而 Stanford C
  • 当 JMS Prod 位于辅助 POJO 类中时,如何在事务中包含 JMS Producer

    简短的问题 有没有办法强制无状态 EJB 调用的 POJO 存在于 EJB 的上下文中 以便事务和资源注入可以在 POJO 中工作 具体来说 在我想要做的事情的上下文中 如何在 EJB 的事务中包含 POJO JMS 生产者 该生产者在调用
  • java.lang.Object的hashCode具体使用的算法是什么

    中使用的算法是什么JVM实施java lang Object的隐含的hashCode 方法 OpenJDK or Oracle JDK答案中首选 它依赖于实现 并且在很大程度上 该算法是entirely取决于实施 只要它是一致的 但是 根据
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 合并两个地图的最佳实践是什么

    如何将新地图添加到现有地图 地图具有相同的类型Map
  • MongoDB java 驱动程序 3.0 在身份验证时无法捕获异常

    我超级卡住o 0 在尝试通过 Java 驱动程序进行身份验证时 存在捕获异常的问题 正如你可能会看到的Throwable类不工作 private MongoClient mongoClient private MongoDatabase m
  • 配置jmxremote时无法正常停止tomcat

    我添加了一个jmxremotecatalina bat中的配置 set JAVA OPTS Dcom sun management jmxremote port 9004 Dcom sun management jmxremote ssl
  • Java和手动执行finalize

    如果我打电话finalize 在我的程序代码中的一个对象上 JVM当垃圾收集器处理这个对象时仍然再次运行该方法吗 这是一个大概的例子 MyObject m new MyObject m finalize m null System gc 是
  • Android项目中使用java获取电脑的IP地址

    我在用ksoap2 android http code google com p ksoap2 android 我需要使用java获取IP地址 这样我就不必每次都手动输入它 我所说的 IP 地址是指 例如 如果我这样做ipconfig使用命
  • Java 中处理异步响应的设计模式

    我读过类似问答的答案 如何在 JAVA 中创建异步 HTTP 请求 https stackoverflow com questions 3142915 how do you create an asynchronous http reque
  • JPA 将 BigDecimal 作为整数保存在数据库中

    我在数据库中有这个字段 ITEMCOST NUMERIC 13 DEFAULT 0 NOT NULL 在JAVA中 Entity中的字段定义如下 Column name ITEMCOST private BigDecimal itemCos
  • 将数组值导出到 csv 文件 java

    我只需要帮助将数组元素导出到 csv 文件 我不知道我的代码有什么问题 任何帮助将不胜感激 谢谢 for int index 0 index lt cols length index FileWriter fw new FileWriter

随机推荐

  • sqoop job 定时实现增量、全量导入Hive

    本人使用工具 Windows 和 虚拟机链接的工具为 MobaXterm Windows链接数据库工具 Navicat 本人的数据库字段为 sqoop 实现全量导入执行的语句为 sqoop import connect jdbc mysql
  • redis未授权漏洞

    redis未授权漏洞是什么 Redis 默认情况下会绑定在 0 0 0 0 6379 这样将会将 Redis 服务暴露到公网上 如果在没有开启认证的情况下 可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取 Redis
  • 浅谈tidb事务与MySQL事务之间的区别

    MySQL是我们日常生活中常见的数据库 他的innodb存储引擎尤为常见 在事务方面使用的是扁平事务 即要么都执行 要么都回滚 而tidb数据库则使用的是分布式事务 两者都能保证数据的高一致性 但是在实现方式上是不一样的 我们先来看看MyS
  • 用python实现一个简单的语音录入转换文字的程序

    依赖安装 pip install SpeechRecognition 脚本代码 py import speech recognition as sr 初始化语音识别器 r sr Recognizer 开始录音 with sr Microph
  • 类型转换前后,对数值的影响

    做一个程序有一个函数是计算电量的 需要把转数转化用电量 原来是这样写的 pulse val gt energy float power count pulse power config pulse config imp 这种写法导致ener
  • TDK用html编写,关于dedecms首页TDK、栏目页TDK、文章页TDK设置-主页设置

    以dedecms免费模板安装后为例 首页TDK设置 栏目页TDK设置 文章页TDK设置首先找到这三个模板文件 分别是index html list article html article article html三个模板 以下是他们的截图
  • 如何利用IDM下载磁链视频

    用过IDM的应该都知道 idm的下载速度很快 但是美中不足的是idm只支持直链下载 P2P的磁链和种子资源都没法直接用idm下载 不过虽然没办法直接用idm下载 但是却可以用第三方工具将磁链转化成直链来下载 图1 IDM下载器 1 在IDM
  • JDBC(mysql和Oracle两种方法)

    JDBC JDBC API是一个Java API 可以访问任何类型表列数据 特别是存储在关系数据库中的数据 JDBC代表Java数据库连接 JDBC库中所包含的API通常与数据库使用于 连接到数据库 创建SQL或MySQL语句 在数据库中执
  • Axure RP--以一个导航为案例介绍如何做鼠标移入时事件

    鼠标移入时展开面板 在网页常见于鼠标移入在一级导航时展开二级导航 即手风琴式菜单 或见于电商网站的商品目录 鼠标悬停在一级分类时展开二级或更多分类 下面以一个导航为案例介绍如何做鼠标移入时事件 步骤1 从部件库拖拽一个矩形到线框图编辑区中
  • 利用ENVI软件计算NDVI常见错误经验总结

    本人初次学习ENVI软件 就碰到了一个大的bug 实验了一天终于搞定了 记录如下 NDVI 的作用就不多说了 计算公式大家都知道是利用 近红外波段 红波段 近红外波段 红波段 的公式 在envi中使用transform下的NDVI公式时需要
  • CV—BaseLine总结(从AlexNet到SENet的发展历程)

    一 初衷 深度学习从2015年发展到现在 模型也在不断地迭代优化 现在许多新的模型往往是站在巨人的肩膀上 在这里想记录下baseline模型发展的一个历程 以及不断更新的内容 不会将模型的每一层剖开来将 而是将关键的创新点进行重点记录 当然
  • 【ECharts】无法找到模块“echarts”的声明文件

    先看问题 解决方式 声明echarts 文件目录如下 代码演示如下 declare module echarts const echarts any export default echarts 实现效果
  • Python爬虫引入

    什么是爬虫 通过编写程序 模拟浏览器上网 让其在互联网上抓取数据的过程 爬虫的价值 实际应用 抓取互联网上的数据 为我所用 就业 爬虫究竟是合法还是非法的 在法律中不被禁止 具有违法风险 善意爬虫 恶意爬虫 爬虫带来的风险可以体现在如下两个
  • HDU--1242:Rescue (BFS)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1242 2 易错点 可能存在多个朋友 即多个map 中有多个 r 所以起始点为Angel的位置 最短时间为到达最近的朋友的时间 3 源代码 H
  • Hands-On Hyperledger Fabric——Fabric模块

    文章目录 Fabric模块在系统中的作用 peer模块 orderer模块 Fabric数据安全传输的方式 Fabric模块在系统中的作用 前面我们知道Fabric是由多个模块组成的程序组 peer orderer cryptogen co
  • if-else 判断输出的字符是大写字母、小写字母、数字或者其他类型

    if else判断输出的字符是大写字母 小写字母 数字 或者其他类型 include
  • Unity 接入Facebook 登陆后报错 "所提供的网址不被应用程序所接纳"

    注意 笔者使用的是Facebook SDK for Unity 错误截图 检查Facebook 开发者后台 是否已经针对对应的 平台 配置相关的数据 以安卓为例 软件包名称 Package Name 顾名思义 就是打包出来的包名 默认活动类
  • v-loading的使用(ElementUI)

    前言 需要获取后端接口数据到页面上进行显示 所以在请求发起至数据渲染页面的这段时间 为页面提供一个 loading 加载是极为必要的 1 区域加载 以 table 表格为例 使用 v loading 为其绑定一个布尔值 true false
  • 定制Android版本的chromium之笔记

    在前面的两篇文章中 分别介绍了如何下载Google Chromium源码 以及编译Android版本的chromium浏览器 准备知识 在实际的开发中 如果直接在chrome的源码上修改代码 既费时也费力 在github找了一个可以直接用
  • java记录操作日志

    记录 logPointCut 方法只是用于定义切点 指定了哪些方法会被拦截 而获取方法上的 OperateLog 注解是为了在切面逻辑中判断是否需要记录操作日志 这两者是配合使用的 前者确定拦截的位置 后者确定在拦截的位置上是否执行操作日志