100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Spring aop 记录操作日志 Aspect 自定义注解

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

时间:2019-07-28 20:08:47

相关推荐

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@Inheritedpublic @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.ponent;import com.opr.annotation.OperLog;@Aspect@Componentpublic 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="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:aop="/schema/aop"xmlns:mvc="/schema/mvc"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-4.3.xsd/schema/context/schema/context/spring-context-4.3.xsd/schema/aop/schema/aop/spring-aop-4.3.xsd/schema/mvc/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.运行项目后

7.成功

1).前端效果:

2).后台打印:

8.失败

1).前端效果:

2).后台打印:

源码下载地址:/download/qq_16437937/10188600

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

邮箱为:Leifeiwangyi@

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。