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 { @Override
protected 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_del
if (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;
} @Override
public 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. 利用Struts拦截器限制上传图片的格式和大小

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

  2. 六 Struts 拦截器、OGNL表达式

    一.OGNL表达式1.概念:是表达式语言,专门用来访问对象取值用的.2.对比EL表达式使用场景: A.EL主要用在web的jsp页面取值 B.OGNL适用以下环境 1.java程序中 2.在页面使用( ...

  3. Java拦截器+注解搭配使用

    拦截器加注解可以实现登录权限验证等操作,我的应用场景也是为了验证这个,下面是简单的实现步骤   一.什么是拦截器? 拦截器是对action的一种拦截,可以在请求前后进行一些处理 可拦截controll ...

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

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

  5. Struts2基础-4-2 -struts拦截器实现权限控制案例+ 模型驱动处理请求参数 + Action方法动态调用

    1.新建项目,添加jar包到WEB-INF目录下的lib文件夹,并添加到builde path里面 整体目录结构如下 2.新建web.xml,添加struts2核心过滤器,和默认首页 <?xml ...

  6. Struts拦截器设置完的值为什么在页面取不到

    Struts拦截器设置完的值为什么在页面取不到. ActionContext ac = (ActionContext) invocation.getInvocationContext(); ac.pu ...

  7. Struts拦截器解析

    内建拦截器可以去struts-core.jar中的struts-default.xml文件中查看: 在没有引用内建拦截器时,已经帮我们指定了一个默认的拦截器: 使用的软件为MyEclipse:很强大!

  8. (转)Struts 拦截器

    一.拦截器是怎么实现: 实际上它是用Java中的动态代理来实现的 二.拦截器在Struts2中的应用 对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作.像params拦截器将http请 ...

  9. struts——拦截器

    什么是拦截器 拦截器(Interceptor)是Struts 2的一个强有力的工具,有许多功能都是构建于它之上,如国际化(前两篇博客介绍过).转换器,校验等. 拦截器是动态拦截Action调用的对象. ...

随机推荐

  1. [原创作品]一个实用的js倒计时器 postby:zhutty.cnblogs.com

    今天做了一个手机短信发送倒计时,额,就是每隔多长时间可以重新发送的功能.贡献出来给园有吐槽点评. //倒计时,time:时长(秒),scb:每秒回调,cb:计时完成回调 var timing = fu ...

  2. DevExpress之列表控件

    listBoxControl和checkedListBoxControl 常用属性 DataSource---------数据源 DisplayMember-----默认显示成员 这两个属性是list ...

  3. SMO启发式选择

    %% % svm 简单算法设计 --启发式选择 %% clc clear close all % step=0.05;error=1.2; % [data, label]=generate_sampl ...

  4. 最长回文字符串(manacher算法)

    偶然看见了人家的博客发现这么一个问题,研究了一下午, 才发现其中的奥妙.Stupid. 题目描述:      回文串就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串. ...

  5. Mybatis高级映射、动态SQL及获得自增主键

    一.动态SQL 相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list authorList,需要根据authorList里已有的作者信息在数据库中查询相应作者 ...

  6. 局域网指定 IP 地址后无法上网的问题

    子网掩码.默认网关.DNS 与局域网设置有关,建议指定前先 运行 cmd -> ipconfig /all 查看一下自动获取的信息. 另外留意指定IP 后需打开高级设置 -> WINS,勾 ...

  7. 前端 HTML基础

    前端三大利器概述 学习前端,不得不学习前端中的三大利器:html + css + javascript.那么这三个组件分别起到什么作用呢?以人体为例,单单具有html属性的人,只是一个裸体的人偶(理解 ...

  8. 安装Node.js

    1.window下安装Node.js 安装git,方便使用命令行. 网址:http://www.git-scm.com/download/ 下载后直接安装即可 接着安装Node.js https:// ...

  9. c - 将十进制转换为字符串.

    递归实现: /* 输入:十进制整数. 输出:字符串. */ void conv(int decimal) { != ) conv(); putchar( + '); }

  10. centos静默式安装Oracle11g

    1.   Centos及Oracle版本 Centos:CentOS release 6.4 (Final) Oracle:linux.x64_Oracle_11gR2_database 2.   硬 ...