struts拦截器+注解实现网络安全要求中的日志审计功能
J2EE项目中出于安全的角度考虑,用户行为审计日志功能必不可少,通过本demo可以实现如下功能:
1.项目中记录审计日志的方法.
2.struts拦截器的基本配置和使用方法.
3.struts拦截器中获得用户访问的类和访问的方法.
4.注解的基本用法,以及在struts拦截器中使用注解.
5.struts拦截器中获得用户访问的IP地址,可扩展对IP进行鉴权功能(允许或限制某些IP).
系统运行一段时间后,通过这些审计日志还可以挖掘的内容:
1.用户行为审计,发现最异常情况及时调整和处理.
2.统计哪些模块访问的频度最高,调整界面把用户访问最高的模块放到显著位置.
3.统计各个功能模块方法的访问时长,有助于我们进行程序性能的优化.
4.用户关联行为分析,优化访问流程,提高用户体验.
项目结构:
功能代码:
AuditLogInterceptor.java(知识点见注释):
package com.tgb.lk.auditlog;import java.lang.reflect.Method;
import java.util.Date;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.tgb.lk.model.AuditLog;public class AuditLogInterceptor extends MethodFilterInterceptor {@Overrideprotected String doIntercept(ActionInvocation actioninvocation)throws Exception {AuditLog auditLog = new AuditLog();auditLog.setStartTime(new Date());// 设置开始时间String result = actioninvocation.invoke();// 递归调用拦截器auditLog.setEndTime(new Date());// 设置结束时间String userId = (String) ServletActionContext.getRequest().getSession().getAttribute("userId");auditLog.setUserId(userId);// 设置登录用户的Id,在用户登录时把id保存到session中,这里可扩展判断用户是否登录的验证和权限验证/*String name = actioninvocation.getInvocationContext().getName();String methodName = "";// struts.xml中配置:// <package name="user" namespace="/user" extends="default">// <action name="user_*" class="com.tgb.lk.action.UserAction" method="{1}">//// 访问地址: http://127.0.0.1:8080/AuditLogDemo/user/user_add// http://127.0.0.1:8080/AuditLogDemo/user/user_delif (name != null && name.contains("_")) {methodName = name.substring(name.indexOf("_") + 1, name.length());}*/String methodName = actioninvocation.getProxy().getMethod();if (methodName.length() > 0) {Object action = actioninvocation.getAction();Class clazz = action.getClass();// 如果设置了注解则读取注解的内容,如果没有设置注解则记录登录的class名if (clazz.isAnnotationPresent(AuditLogger.class)) {AuditLogger talClazz = (AuditLogger) clazz.getAnnotation(AuditLogger.class);auditLog.setClazz(talClazz.log());} else {auditLog.setClazz(clazz.getSimpleName());}Method method = action.getClass().getMethod(methodName, null);// 如果设置了注解则读取注解的内容,如果没有设置注解则记录登录的method名if (method.isAnnotationPresent(AuditLogger.class)) {AuditLogger alm = (AuditLogger) method.getAnnotation(AuditLogger.class);auditLog.setMethod(alm.log());} else {auditLog.setMethod(methodName);}String ip = ServletActionContext.getRequest().getRemoteAddr();auditLog.setIp(ip);// 记录登录的IP,这里还可以对IP进行鉴权功能(允许或限制某些IP)auditLog.setResult(result);// 记录登录时返回的结果.System.out.println(auditLog);// auditLogService.save(auditLog); //保存入库}return result; // 跳转}}
struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><constant name="struts.devMode" value="true" /><package name="default" namespace="/" extends="struts-default"><interceptors><!-- 日志审计拦截器 --><interceptor name="auditlog"class="com.tgb.lk.auditlog.AuditLogInterceptor" /><interceptor-stack name="myStack"><interceptor-ref name="auditlog"><!--配置到excludeMethods中的方法将不记录日志--><param name="excludeMethods">testExclude</param></interceptor-ref><!--struts默认的拦截器--><interceptor-ref name="defaultStack" /></interceptor-stack></interceptors><default-interceptor-ref name="myStack" /></package><!-- 注意extends="default" --><package name="user" namespace="/user" extends="default"><action name="user_*" class="com.tgb.lk.action.UserAction" method="{1}"><result name="add">/index.jsp</result><result name="del">/index.jsp</result><result name="modify">/index.jsp</result><result name="view">/index.jsp</result></action></package></struts>
注解类AuditLogger.java:
package com.tgb.lk.auditlog;import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target( { java.lang.annotation.ElementType.METHOD,java.lang.annotation.ElementType.TYPE })
public @interface AuditLogger {public abstract String log();}
Struts的Action中使用配置:
package com.tgb.lk.action;import com.tgb.lk.auditlog.AuditLogger;@AuditLogger(log = "用户管理")
public class UserAction {@AuditLogger(log = "添加用户")public String add() {return "add";}@AuditLogger(log = "删除用户")public String del() {return "del";}@AuditLogger(log = "修改用户")public String modify() {return "modify";}@AuditLogger(log = "浏览用户信息")public String view() {return "view";}}
实体类AuditLog.java
package com.tgb.lk.model;import java.util.Date;public class AuditLog {private int id;private String userId;private Date startTime;private Date endTime;private String ip;private String clazz;private String method;private String result;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public Date getStartTime() {return startTime;}public void setStartTime(Date startTime) {this.startTime = startTime;}public Date getEndTime() {return endTime;}public void setEndTime(Date endTime) {this.endTime = endTime;}public String getIp() {return ip;}public void setIp(String ip) {this.ip = ip;}public String getClazz() {return clazz;}public void setClazz(String clazz) {this.clazz = clazz;}public String getMethod() {return method;}public void setMethod(String method) {this.method = method;}public String getResult() {return result;}public void setResult(String result) {this.result = result;}@Overridepublic String toString() {return "AuditLog [id=" + id + ", userId=" + userId + ", ip=" + ip+ ", startTime=" + startTime + ", endTime=" + endTime+ ", clazz=" + clazz + ", method=" + method + ", result="+ result + "]";}}
代码下载地址:http://download.csdn.net/detail/lk_blog/6003581
限于本人水平有限,很多地方写的并不完美,望大家不吝赐教,希望在和大家的交流中得到提高.
struts拦截器+注解实现网络安全要求中的日志审计功能相关推荐
- springboot + 拦截器 + 注解 实现自定义权限验证
springboot + 拦截器 + 注解 实现自定义权限验证 最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity.因此用拦截器和注解结合实现了权限控制. 1.1 定 ...
- 利用Struts拦截器限制上传图片的格式和大小
在这之前 Struts的一个核心功能就是大量的拦截器,既然是框架,那么自然也就贴心地为我们准备好了各种常用的功能,比如这里即将讨论的如何限制上传图片的格式和大小.那么既然是使用Struts已经写好的拦 ...
- Struts 拦截器权限控制【通过拦截器实现登录后跳转到登录前页面】
应用情形:在web项目中,经常会遇到用户未登录或SESSION失效时用户发出非法的权限操作,如新闻的评论.文件的下载等等,在此我们可以使用struts拦截器对该用户发出的请求进行拦截,拦截后判断用户是 ...
- java struts 拦截器_java框架篇---struts实现拦截器
Struts2的拦截器和Servlet过滤器类似.在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept ...
- Spring MVC拦截器+注解方式实现防止表单重复提交
原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不存在了,所有无法验证通过. 1.新建注解: /*** <p&g ...
- 用拦截器+注解+cookie进行简单限流访问案例
文章目录 1.写限流注解 2.redis相关类 3.添加自定义拦截器: 4.controller中使用注解 之前有一篇用aop+redis+lua进行限流的案例: springboot中使用aop+r ...
- 域名微信拦截html代码,多域名下获取微信openId,通过拦截器注解实现,减少代码量以及业务混淆...
一个注解,一个拦截器,还有一个中转html页(来源网上,稍微修改),原理看拦截器的类注解.package com.xxx.admin.interceptor; import com.xxx.core. ...
- 利用mybatis拦截器注解处理sql
首先@Intercepts注解 可以看这篇文章https://blog.csdn.net/weixin_43505211/article/details/128050083 建个类 实现 Interc ...
- 【struts2+hibernate+spring项目实战】用户登录校验(struts拦截器)
一.概述 项目中所有页面均放入WEB-INF,所有页面安全性得到了很大程度的提高.但是当用户登录后长时间没有操作时,会造成Session数据的过期,如果此时获取Session中的数据,必定会引发WEB ...
最新文章
- 字符串的html语言,html语言解析为属性字符串NSMutableAttributedString
- java如何读取excel文件
- 【数据结构】顺序栈与链表栈
- mysql 半同步关闭_MySQL的半同步模式配置
- Tour West Australia by Motorcycle
- linux内核发包工具,Linux内核发包工具pktgen测试方案说明
- python网络爬虫系列教程——PhantomJS包应用全解
- 一文搞懂NLP中的对抗训练
- 历史文章之机器学习和深度学习
- pandownload 替代品_Pandownload倒下了,找一款替代品
- 电商数据分析Excel案例
- 双物块弹簧阻尼系统模型,李雅普诺夫稳定性分析,matlab仿真验证
- matlab幅度调制滚动条的程序_利用MATLAB实现信号的幅度调制与解调
- 二叉树交换左右子树的递归与非递归算法
- GPRS电力远程自动抄表系统解决方案
- 有效的亚像素图像配准算法
- AB32实例应用(4.非常规经验及技巧)
- 清华大学数据挖掘课程幕课习题(第二章)
- C语言读取文件函数:fgets(); fgetc()
- sbt oracle,使用Oracle默认SBT接口测试磁带通道 | 学步园