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拦截器+注解实现网络安全要求中的日志审计功能相关推荐

  1. springboot + 拦截器 + 注解 实现自定义权限验证

    springboot + 拦截器 + 注解 实现自定义权限验证 最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity.因此用拦截器和注解结合实现了权限控制. 1.1 定 ...

  2. 利用Struts拦截器限制上传图片的格式和大小

    在这之前 Struts的一个核心功能就是大量的拦截器,既然是框架,那么自然也就贴心地为我们准备好了各种常用的功能,比如这里即将讨论的如何限制上传图片的格式和大小.那么既然是使用Struts已经写好的拦 ...

  3. Struts 拦截器权限控制【通过拦截器实现登录后跳转到登录前页面】

    应用情形:在web项目中,经常会遇到用户未登录或SESSION失效时用户发出非法的权限操作,如新闻的评论.文件的下载等等,在此我们可以使用struts拦截器对该用户发出的请求进行拦截,拦截后判断用户是 ...

  4. java struts 拦截器_java框架篇---struts实现拦截器

    Struts2的拦截器和Servlet过滤器类似.在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept ...

  5. Spring MVC拦截器+注解方式实现防止表单重复提交

    原理:在新建页面中Session保存token随机码,当保存时验证,通过后删除,当再次点击保存时由于服务器端的Session中已经不存在了,所有无法验证通过. 1.新建注解: /*** <p&g ...

  6. 用拦截器+注解+cookie进行简单限流访问案例

    文章目录 1.写限流注解 2.redis相关类 3.添加自定义拦截器: 4.controller中使用注解 之前有一篇用aop+redis+lua进行限流的案例: springboot中使用aop+r ...

  7. 域名微信拦截html代码,多域名下获取微信openId,通过拦截器注解实现,减少代码量以及业务混淆...

    一个注解,一个拦截器,还有一个中转html页(来源网上,稍微修改),原理看拦截器的类注解.package com.xxx.admin.interceptor; import com.xxx.core. ...

  8. 利用mybatis拦截器注解处理sql

    首先@Intercepts注解 可以看这篇文章https://blog.csdn.net/weixin_43505211/article/details/128050083 建个类 实现 Interc ...

  9. 【struts2+hibernate+spring项目实战】用户登录校验(struts拦截器)

    一.概述 项目中所有页面均放入WEB-INF,所有页面安全性得到了很大程度的提高.但是当用户登录后长时间没有操作时,会造成Session数据的过期,如果此时获取Session中的数据,必定会引发WEB ...

最新文章

  1. 字符串的html语言,html语言解析为属性字符串NSMutableAttributedString
  2. java如何读取excel文件
  3. 【数据结构】顺序栈与链表栈
  4. mysql 半同步关闭_MySQL的半同步模式配置
  5. Tour West Australia by Motorcycle
  6. linux内核发包工具,Linux内核发包工具pktgen测试方案说明
  7. python网络爬虫系列教程——PhantomJS包应用全解
  8. 一文搞懂NLP中的对抗训练
  9. 历史文章之机器学习和深度学习
  10. pandownload 替代品_Pandownload倒下了,找一款替代品
  11. 电商数据分析Excel案例
  12. 双物块弹簧阻尼系统模型,李雅普诺夫稳定性分析,matlab仿真验证
  13. matlab幅度调制滚动条的程序_利用MATLAB实现信号的幅度调制与解调
  14. 二叉树交换左右子树的递归与非递归算法
  15. GPRS电力远程自动抄表系统解决方案
  16. 有效的亚像素图像配准算法
  17. AB32实例应用(4.非常规经验及技巧)
  18. 清华大学数据挖掘课程幕课习题(第二章)
  19. C语言读取文件函数:fgets(); fgetc()
  20. sbt oracle,使用Oracle默认SBT接口测试磁带通道 | 学步园

热门文章

  1. windows server疑难杂症
  2. tomcat 之 tomcat实例配置
  3. Kali Linux渗透基础知识整理(四):维持访问
  4. OpenStack Trove2
  5. 【.NET】使用HtmlAgilityPack抓取网页数据
  6. [Java]jvm参数选项中文文档
  7. Redis基础笔记 (二)
  8. oracle 制定定时任务
  9. Software Testing Resource
  10. 基于腾讯云服务器部署微信小程序后台服务(Python+Django)