文档章节

注解式日志拦截

许雷神
 许雷神
发布于 2015/05/17 16:38
字数 630
阅读 22
收藏 0
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();

}


///////////////////////////////////////
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.test.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; // 跳转
	}

}
///////////////////////////////
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 + "]";
	}

}

/////////////////////
<?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.test.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>


本文转载自:#

许雷神
粉丝 7
博文 13
码字总数 0
作品 0
广州
私信 提问
springmvc 实现注解式权限验证

对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现。但借助于Spring MVC中的act...

岸芷汀兰
2015/05/22
573
0
Java模块化开发框架--Strato Framework

Strato((音st'rɑ:təʊ)是一个Java Web开发框架,为开发者提供快速、敏捷、可持续维护的Web应用架构基础。 主要特性: 1.基于OSGi可插拔设计,可实现局部快速更新 2.基于注解(Annotation)的...

strato
2016/07/05
1K
2
简洁优雅的全栈式 MVC 框架 - blade

基于 + 创造的轻量级、高性能、简洁优雅的Web框架 花 1小时 学会它做点有趣的项目,一款除了Spring系框架的不二之选。 快速开始 BladeInAction 视频教程 参与贡献 捐赠我们 English Blade是什...

王爵nice
2015/07/07
9.8K
2
springboot xml声明式事务管理方案

在开发过程中springboot提供的常见的事务解决方案是使用注解方式实现。 使用注解 在启动类上添加注解 @EnableTransactionManagement 在需要事务控制的方法添加@Transactional注解 这种方式问...

文文1
03/09
84
0
spring aop , tx

一 .面向切面编程(AOP)的基础概念: 以一个普通的java方法来举例 a. 横切关注点:如上面5个通知的位置,在java对象中,可以这些具有类似共同处理逻辑的位置加入如权限验证、事物处理、日志记...

SKYCOBS
2016/08/18
25
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
10
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
8
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
11
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部