Spring aop 记录操作日志 Aspect 自定义注解

本文内容纲要:Spring aop 记录操作日志 Aspect 自定义注解

时间过的真快,转眼就一年了,没想到随手写的笔记会被这么多人浏览,不想误人子弟,于是整理了一个优化版,在这里感谢智斌哥提供的建议和帮助,话不多说,进入正题

所需jar包 :spring4.3相关联以及aspectjweaver-1.8.5.jar,jdk 1.7,1.8亲测可用,源码下载链接放在最后,关键代码如下:

1.Action

package com.opr.controller;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.ModelAndView;

import com.opr.service.UserService;

@Controller

@RequestMapping("user")

public class UserController {

@Autowired UserService userService;

/***

* 首页

* @param request

* @param response

* @return ModelAndView

*/

@RequestMapping("index")

public ModelAndView index(HttpServletRequest request,HttpServletResponse response) {

return new ModelAndView("index");

}

/***

* 登录

* @param request

* @param response

* @return ModelAndView

*/

@RequestMapping("userLogin")

public ModelAndView userLogin(HttpServletRequest request,HttpServletResponse response,

String userName,String password) {

ModelAndView mv = new ModelAndView();

try {

boolean result = userService.userLogin(userName,password);

if(result) {

mv.setViewName("success");

}else {

mv.setViewName("error");

}

} catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

return mv;

}

}

2.Service

package com.opr.service.impl;

import org.springframework.stereotype.Service;

import com.opr.annotation.OperLog;

import com.opr.service.UserService;

@Service("userService")

public class UserServiceImpl implements UserService {

//设置默认值,模拟登录

private final String userName = "admin";

private final String password = "123456";

@Override

@OperLog(operType="用户登录",userIndex = 0 )//0为下标,代表传入的第一个参数,这里取userName为示例。实际场景可以在session中取操作人!

public boolean userLogin(String userName,String password) {

boolean flag = false;

if(this.userName.equals(userName) && this.password.equals(password)) {

flag = true;

}

return flag;

}

}

3.自定义注解

package com.opr.annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

//这里不明白的童鞋可以抽空看看自定义注解

@Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

public @interface OperLog {

//操作类型

String operType() default "";

//操作人

String user() default "";

//操作人下标

int userIndex() default -1;

}

4.拦截器

package com.opr.interceptor;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.springframework.stereotype.Component;

import com.opr.annotation.OperLog;

@Aspect

@Component

public class OperLogInterceptor {

//这里写的为环绕触发 ,可自行根据业务场景选择@Before @After

//触发条件为:com.opr包下面所有类且注解为OperLog的

@Around("within(com.opr..*) && @annotation(operLog)")

public Object doAroundMethod(ProceedingJoinPoint pjd,OperLog operLog) throws Throwable {

long startTime=System.currentTimeMillis();//开始时间

Object[] params = pjd.getArgs();//获取请求参数

System.out.println("监听到传入参数为:");

for(Object param:params) {

System.out.println(param);

}

//###################上面代码为方法执行前#####################

Object result = pjd.proceed();//执行方法,获取返回参数

//###################下面代码为方法执行后#####################

System.out.println("返回参数为:" + result);

String user = operLog.userIndex()==-1?operLog.user():(String)params[operLog.userIndex()];//操作人

String operType = operLog.operType();//操作类型

System.out.println("操作人: " + user +" 操作类型: " + operType);

long endTime=System.currentTimeMillis();//结束时间

float excTime=(float)(endTime-startTime)/1000;

System.out.println("执行时间:"+excTime+"s");

System.out.println("#######################分隔符##########################");

return result;

}

}

5.Spring

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.3.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-4.3.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-4.3.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">

<!-- 设置扫描目录 -->

<context:component-scan base-package="com.opr" />

<!-- 设置请求映射器 -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

<!-- 设置适配器处理器 -->

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

<!-- 设置视图处理器 -->

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/jsp/"/>

<property name="suffix" value=".jsp" />

</bean>

<aop:aspectj-autoproxy proxy-target-class="true" />

</beans>

6.运行项目后

Image

7.成功

  1).前端效果:

  Image

  2).后台打印:

  Image

8.失败

  1).前端效果:

  Image

  2).后台打印:

   Image

源码下载地址:http://download.csdn.net/download/qq_16437937/10188600

吐槽一下:CSDN下载最低为2分,分不够的可以邮箱@我,或者在下面留下你的邮箱,我看到了就会发你

邮箱为:Leifeiwangyi@163.com

有什么问题可以留言咱们讨论讨论,谢谢大家

本文内容总结:Spring aop 记录操作日志 Aspect 自定义注解

原文链接:https://www.cnblogs.com/leifei/p/8194644.html

以上是 Spring aop 记录操作日志 Aspect 自定义注解 的全部内容, 来源链接: utcz.com/z/296887.html

回到顶部