struts2.5.30系统添加操作日志

news/2024/4/18 11:25:39/文章来源:https://blog.csdn.net/qq3892997/article/details/129160159

背景:因公司所有项目都需要按照某个标准进行升级,因此所有项目都需要添加操作日志,又因手上struts项目较多没时间全部升级为springboot,因此直接在struts添加拦截器(添加操作日志),struts1.2升级至2.5.30可查看升级

struts2添加拦截器步骤:

  1. 先定义拦截器 :


/***操作日志记录 实体类* */
public class OperationLog {String userId;String operationTime;String actionName;String method;String param;String result;String requestIp;String uri;@Overridepublic String toString() {return "OperationLog [userId=" + userId + ", operationTime=" + operationTime + ", actionName=" + actionName+ ", method=" + method + ", param=" + param + ", result=" + result + ", requestIp=" + requestIp+ ", uri=" + uri + "]";}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public String getOperationTime() {return operationTime;}public void setOperationTime(String operationTime) {this.operationTime = operationTime;}public String getActionName() {return actionName;}public void setActionName(String actionName) {this.actionName = actionName;}public String getMethod() {return method;}public void setMethod(String method) {this.method = method;}public String getParam() {return param;}public void setParam(String param) {this.param = param;}public String getResult() {return result;}public void setResult(String result) {this.result = result;}public String getRequestIp() {return requestIp;}public void setRequestIp(String requestIp) {this.requestIp = requestIp;}public String getUri() {return uri;}public void setUri(String uri) {this.uri = uri;}

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.Calendar;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.dispatcher.Parameter;
import com.esl.wifs.domain.User;
import com.esl.wifs.util.DateUtils;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.interceptor.PreResultListener;/*** struts系统日志拦截器*/
public class Dolog implements Interceptor {
//     private IAdminOperationLogService adminOperationLogService;private static final long serialVersionUID = 1L;public String intercept(ActionInvocation ai) throws Exception {ai.addPreResultListener(new PreResultListener() {public void beforeResult(ActionInvocation ai, String arg1) { //写入DBOperationLog log = new OperationLog();HttpServletRequest request = ServletActionContext.getRequest();try {log.setOperationTime(DateUtils.getNow());//操作时间Map<String, Object> session = ai.getInvocationContext().getSession();User user = (User) session.get("sessionUser");if (user != null) {log.setUserId(user.getLoginname() + "(" + user.getPname() + ")");} else {log.setUserId("未登录");}Map<String, Parameter> map = ai.getInvocationContext().getParameters();Set<String> keys = map.keySet();StringBuffer sb = new StringBuffer(); //因未引入JSON,因此参数暂时拼接处理for (String key : keys) {sb.append(key + "=" + map.get(key).getValue()+ "#");}log.setRequestIp(request.getRemoteAddr()); //请求的IP地址log.setActionName(ai.getAction().getClass().toString());//类名log.setMethod(ai.getInvocationContext().getName());//方法名log.setUri(request.getRequestURI()); // 请求URIlog.setParam(sb.toString());//参数log.setResult(ai.getResultCode());//返回结果//...//插入数据库  -----待实现saveLog(log.toString());//写入本地文件} catch (Exception e) {e.printStackTrace();}}});return ai.invoke();}public static void saveLog(String content) {//String appPath = ServletActionContext.getServletContext().getRealPath("/"); //当前项目所在路径 ;String appPath = "d://OperLog";//为了方便找到日志,直接写入D盘下的某个文件夹try {File path = new File(appPath);if (!path.exists()) {path.mkdir();}File LogDir = new File(path + "/" + (Calendar.getInstance().get(Calendar.MONTH) + 1));if (!LogDir.exists()) {LogDir.mkdir();}File file = new File(LogDir + "/" + Calendar.getInstance().get(Calendar.DAY_OF_MONTH)  + ".log");if (!file.exists()) {file.createNewFile();}BufferedWriter br = new BufferedWriter(new FileWriter(file, true));br.write(content);br.newLine();br.flush();br.close();File LogDirOld = new File(path  + "/"  + (Calendar.getInstance().get(Calendar.MONTH) - 2 > 0 ? (Calendar.getInstance().get(Calendar.MONTH) - 2): Calendar.getInstance().get(Calendar.MONTH) + 10));if (LogDirOld.exists()) {File[] fileOlds = LogDirOld.listFiles();for (File f : fileOlds) {f.delete();}LogDirOld.delete();}} catch (Exception e) {e.printStackTrace();}}public void destroy() {}public void init() {}
}
  1. struts.xml中定义声明拦截器:

注意:拦截器的标签必须是在package标签内,package必须在struts标签内,package标签内其他标签必须在拦截器之下定义,否则保存xml文件就会报错启动也会报错,因struts.xml严格定义了书写顺序),以下是拦截器的定义与指定引用:

    <interceptors><!--  1、定义拦截器 --><interceptor name="dolog" class="com.esl.wifs.web.master.Dolog"></interceptor><!--  2.定义拦截器栈 --><interceptor-stack name="MyStack"><!-- 我们定义了全局拦截器之后,会把父包中的默认拦截器栈覆盖掉了,这里记得引用回来 --><interceptor-ref name="dolog"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- *****************定义操作日志拦截器  END  ****************--><default-interceptor-ref name="MyStack"/><!--*指定当前package下的所有action默认的拦截器 --> 

示例:

因我的项目引入的xml较多,action分的较细,因此package很多,多个package就需要多次定义拦截器,下面只取了其中一个package(一个struts标签下可以有很多package,package标签下可以有很多action标签,定义声明拦截器必须在所有action标签之前声明):

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN""http://struts.apache.org/dtds/struts-2.5.dtd">
<struts><!--  如果接口访问不了,需要在每个action的package上加上 strict-method-invocation="false"--><package name="login" extends="tiles-default" namespace="/login" strict-method-invocation="false"><!-- ***************** 定义操作日志拦截器  START  **************** --><interceptors><!--  1、定义拦截器 --><interceptor name="dolog" class="com.esl.wifs.web.master.Dolog"></interceptor><!--  2.定义拦截器栈 --><interceptor-stack name="MyStack"><!-- 我们定义了全局拦截器之后,会把父包中的默认拦截器栈覆盖掉了,这里记得引用回来 --><interceptor-ref name="dolog"></interceptor-ref><interceptor-ref name="defaultStack"></interceptor-ref></interceptor-stack></interceptors><!-- *****************定义操作日志拦截器  END  ****************--><default-interceptor-ref name="MyStack"/><!--*指定当前package下的所有action默认拦截器 --> <action name="login" class="login" method="login"><result name="SUCCESS" type="redirectAction"><!--登录成功之后跳转的页面--> <param name="actionName">goInquire</param><param name="namespace">/inquire</param></result><result name="updatePwd">/master/personPsw.jsp</result><!-- 登录成功后判断超过90天未修改密码,跳转密码修改页面 --><result name="input">/login.jsp</result><result type="redirect" name="gotowi">${page}?wiid=${id}</result> <!--跳转到登录之前请求的页面--> </action></package><!-- 如果以下还有更多的package标签,且这些标签都有action,且都需要拦截器拦截,那么就需要把前面声明的拦截器再当前package再次声明并引用,否则拦截器只会拦截上面哪个package下的所有action --></struts>

以上完成之后启动项目,执行任何操作,就可以在d盘下的OperLog文件夹下查看操作日志了,需要写入数据库只需要把生成文件的方法改成保存数据库的方法即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72499.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【学习总结】相机与IMU标定一:Kalibr论文

论文&#xff1a;2013IROS论文&#xff0c;Unified Temporal and Spatial Calibration for Multi-Sensor Systems&#xff0c;是Kalibr工具的参考论文之一。介绍了如何进行IMU与相机标定。 参考的一篇资料&#xff1a;知乎&#xff1a;超全汇总&#xff01;多传感器离线/在线时…

新建微服务模块Maven子工程

gitegg-cloud是微服务框架&#xff0c;整体功能是非业务相关的基础功能&#xff0c;在实际业务开发过程中需要新建微服务的业务模块&#xff0c;根据业务的整体规划&#xff0c;设计新建Maven子工程。   下面以常用的电商项目举例新建Maven子工程&#xff0c;电商项目一般包含…

VIIRS-NPP夜间灯光遥感数据下载和预处理

VIIRS-NPP夜间灯光遥感数据下载和预处理 月和年合成产品下载网站 日数据下载网站 一、下载shp掩膜文件 下载好月合成产品后&#xff0c;在这个网站上下载矢量地图&#xff0c; 点击复制按钮&#xff0c;来到这个网站&#xff0c;ctrl v粘贴 点击右上角Export&#xff0c;…

搞懂事件——C# 的event的机制深度理解

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:无尽的折腾后,终于又回到了起点,工控,我来了 !1. 前言 为什么忽然对Event感兴趣了? 因为进入Web时代以后,很少使用它了,忽然想起这个知识点,…

九龙证券|市场化转融资业务试点上线首日平稳运行

2月21日&#xff0c;中国证券金融股份有限公司&#xff08;下称“中证金融”&#xff09;商场化转融资事务试点迎来首个买卖日。全天该事务试点平稳运转&#xff0c;商场化转融资规模合计10亿元。 业内人士以为&#xff0c;商场化转融资事务形式下&#xff0c;证券公司参加转融…

使用51单片机和DS1302时钟芯片做一个简易的电子时钟

简易的电子时钟实验一、前言二、DS1302模块介绍三、驱动DS1302的代码3.1 初始化DS1302时钟芯片3.2 读取DS1302时钟芯片的时间3.3 设置DS1302时钟芯片的时间3.4 读取DS1302时钟芯片的RAM四、读取DS1302时钟芯片的RAM4.1 发送读取RAM的命令4.2 读取RAM的内容4.3 读取部分单独代码…

[飞桨paddle]1. conda安装paddle环境.模型转换,pytorch->paddlepaddle

“一生费城七六人”1. conda装paddle环境1.1 验证是否装好2. x2paddle2.1 介绍2.2 安装3 模型转换3.1 pt -> onnx3.2 onnx > .pdparams3.2.1 会出现的错误情况3-1. 第一种情况3-2. 第二种情况4. 查看结果问题阐述&#xff1a;将yoloV5项目移至paddle框架下执行时&#xf…

中央一号文件首提“即时零售”,县域掀起消费业态新风潮

经过几年的探索&#xff0c;即时零售已经逐步走向成熟&#xff0c;并开始向三四线城市以及乡镇城市渗透。 过去一年&#xff0c;京东、美团、阿里争先布局即时零售市场&#xff0c;完善即时配送网络、培养用户消费习惯&#xff0c;即时零售订单迎来了骤增。2022年下半年&#…

C/C++每日一练(20230222)

目录 1. 部分复制字符串(★) 2. 按字典顺序排列问题(★★) 3. 地下城游戏(★★★) 附录 动态规划 1. 部分复制字符串 将字符串2小写字母复制到字符串1&#xff1a;编写程序,输入字符串s2,将其中所有小写字母复制到字符串数组strl中。例如&#xff1a;aal1bb22cc33de4AA55…

Java实现多线程有几种方式(满分回答)

目录JDK8 创建的线程的两种方式orcle文档解释方式一&#xff1a;继承Thread类方式二&#xff1a;实现Runnable接口同时用两种的情况其他间接创建方式Callable接口线程池JDK8 创建的线程的两种方式 orcle文档解释 orcle文档&#xff1a;https://docs.oracle.com/javase/8/docs…

九龙证券|银行资本管理办法迎“大修” 信用风险权重法调整优化

1年期AAA中债商业银行同业存单到期收益率 日前迎来“大修”的商业银行本钱办理方法&#xff0c;在债券商场激起“涟漪”——债券商场一改此前平静态势&#xff0c;连续两日跌落。 2月21日&#xff0c;10年期国债收益率较上星期五上行2.9个基点&#xff0c;至2.919%&#xff1b…

Redis学习【10】之Redis主从集群(1)

文章目录一 Redis主从集群搭建1 伪集群搭建与配置1.1.1 分级管理1.1.2 容灾冷处理1.2 主从复制原理1.2.1 主从复制过程1.2.2 数据同步演变过程1.3 哨兵机制实现1.3.1 哨兵机制简介1.3.2 Redis 高可用集群搭建1.3.3 Redis 高可用集群的启动1.3.4 Sentinel 优化配置1.4 哨兵机制原…

Spring中自定义Session管理,Spring Session源码解析

系列文章&#xff1a;Spring Boot学习大纲&#xff0c;可以留言自己想了解的技术点 目录 系列文章&#xff1a;Spring Boot学习大纲&#xff0c;可以留言自己想了解的技术点 1、session是什么&#xff1f; 1>session在哪里&#xff1f; 2>服务器怎么知道每次说话的是…

H5盲盒抽奖系统源码

盲盒抽奖系统4.0&#xff0c;带推广二维码防洪炮灰功能和教程。 支持微信无限回调登录 标价就是源码价格&#xff0c;vuetp5框架编写&#xff0c;H5网页&#xff0c;前后端分离 此源码为正规开发&#xff0c;正版产品已申请软著。 开源无加密无授权&#xff0c;可以二开使用…

霍尔元件的应用

霍尔传感器有3个pin&#xff0c;分别是 正极 负极和输出pin。 输出pin接电阻和发光二极管。电阻起限流作用。 电源接5.5v直流电。当拿一个磁铁的N极靠近霍尔元件时&#xff0c;二极管越来越亮。当拿S极靠近霍尔元件时&#xff0c;二极管越来越暗。 N极磁场强度定义为正的磁场强…

算法刷题日志——移除元素,双指针

文章目录删除有序数组中的重复项[删除有序数组中的重复项 II](https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/)移除元素[283. 移动零](https://leetcode.cn/problems/move-zeroes/description/)[844. 比较含退格的字符串](https://leetcode.cn/problem…

Docker之路(3.docker底层原理、和虚拟机VM对比区别)

1.docker run 流程图 2. docker 底层原理 2.1 docker 是怎么工作的&#xff1f; Docker 是一个 Client-Server 结构的系统&#xff0c;Docker的守护进程运行在主机上&#xff0c; 通过Socket从客户端访问&#xff01; DockerServer接收到Docker-Client的指令&#xff0c;就会执…

【Java】Spring的创建和使用

Spring的创建和使用 Spring就是一个包含众多工具方法的IOC容器。既然是容器&#xff0c;那么就具备两个最主要的功能&#xff1a; 将对象存储到容器中从容器中将对象取出来 在Java语言当中对象也叫作Bean。 1. 创建Spring项目 创建一个普通maven项目添加Spring框架支持(spri…

Spring Boot自动装配的原理

Spring Boot自动装配的原理自动装配的实现EnableAutoConfigurationAutoConfigurationImportSelectorSpring Boot中的自动装配&#xff0c;它是Starter的基础&#xff0c;也是Spring Boot的核心。那么什么叫自动装配呢&#xff1f;或者说什么叫装配呢&#xff1f; 简单来说&…

金三银四丨黑蛋老师带你剖析-安全开发岗

作者丨黑蛋在之前呢&#xff0c;我们聊了二进制这块的病毒岗位&#xff0c;漏洞岗位&#xff0c;逆向岗位以及CTF这块的岗位。今天我们就来聊一聊安全开发类的工作岗位。首先网络安全方向中安全开发岗位都有哪些&#xff0c;安全开发主要指安全研发工程师或安全开发工程师&…