为了增加数据的安全性,在数据管理的过程中,我们需要将操作者访问时间,操作者的名称,访问的IP,访问资源的URL,执行时长,访问方法记录下来存储到数据库中,并可以通过页面查看。
1.将日志信息存储到数据库中
1.1根据需要记录的日志内容在数据库中创建表syslog和对应的实体类SysLog
日志表syslog

SysLog类
SysLog1.2在controller包下新建一个切面类LogAop来获取需要记录日志内容
注意该类作为切面类需要注解@Aspect
在该切面类内创建一个前置通知@Before("execution(* club.nipengfei.ssm.controller.*.*(..))"),一个后置通知@After("execution(* club.nipengfei.ssm.controller.*.*(..))"),注解内的属性表示切入点表达式,在这里表示controller包下的所有类。
1.2.1获取操作者的访问时间
直接在前置通知内new一个Date()
1.2.2获取操作者名称
1 // 获取当前操作的用户 2 SecurityContext context = SecurityContextHolder.getContext(); 3 User user =(User) context.getAuthentication().getPrincipal(); 4 String username = user.getUsername();
1.2.3获取访问IP
先在web.xml中新增一个监听器
1 <listener> 2 <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 3 </listener>
通过getRemoteAddr()方法获取IP
1 // 获取IP地址 2 String ip = request.getRemoteAddr();
1.2.4获取访问资源的URL
思路:获取类上注解的@RequestMapping的属性值和方法上注解@RequestMapping的属性值,并将两者拼接。
获取类上注解属性值:通过反射获取操作的类,使用getAnnotation(RequestMapping.class)方法获取@RequestMapping注解,使用value()获取属性
获取方法上注解属性值:通过反射获取操作的类,使用getMethod()方法获取方法,使用getAnnotation(RequestMapping.class)方法获取@RequestMapping注解,使用value()获取属性
具体代码放下面。
1.2.5获取执行时长
在后置通知内new一个Date()减去前置通知的Date()。
1 // 获取访问时长 2 long time = new Date().getTime()-visitTime.getTime();
1.2.6获取访问方法
通过类的getMethod()方法获取方法。
注意:有些方法含参,有些不含参需要分开处理。
1 @Before("execution(* club.nipengfei.ssm.controller.*.*(..))")
2 public void doBefore(JoinPoint jp) throws NoSuchMethodException {
3 visitTime = new Date(); // 当前时间就是开始访问的类
4 clazz = jp.getTarget().getClass(); // 具体访问的类
5 String methodName = jp.getSignature().getName(); // 获取访问方法名称
6 Object[] args = jp.getArgs(); // 获取访问方法参数
7
8 // 获取具体执行方法Method对象
9 if (args==null || args.length==0){
10 method = clazz.getMethod(methodName);
11 } else {
12 Class[] classArgs = new Class[args.length];
13 for (int i=0;i<args.length;i++){
14 classArgs[i] = args[i].getClass();
15 }
16 method = clazz.getMethod(methodName,classArgs);
17 }
18 }
LogAop类的代码:
1 package club.nipengfei.ssm.controller;
2
3 import club.nipengfei.ssm.domain.SysLog;
4 import club.nipengfei.ssm.service.ISysLogService;
5 import org.aspectj.lang.JoinPoint;
6 import org.aspectj.lang.annotation.After;
7 import org.aspectj.lang.annotation.Aspect;
8 import org.aspectj.lang.annotation.Before;
9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.security.core.context.SecurityContext;
11 import org.springframework.security.core.context.SecurityContextHolder;
12 import org.springframework.security.core.userdetails.User;
13 import org.springframework.stereotype.Component;
14 import org.springframework.web.bind.annotation.RequestMapping;
15
16 import javax.servlet.http.HttpServletRequest;
17 import java.lang.reflect.Method;
18 import java.util.Date;
19
20 @Component
21 @Aspect
22 public class LogAop {
23
24 @Autowired
25 private HttpServletRequest request;
26
27 @Autowired
28 private ISysLogService sysLogService;
29
30 private Date visitTime; // 开始时间
31 private Class clazz; // 访问的类
32 private Method method; // 访问的方法
33
34 // 前置通知 主要获取开始时间,执行的类哪一个,执行的哪一个方法
35 @Before("execution(* club.nipengfei.ssm.controller.*.*(..))")
36 public void doBefore(JoinPoint jp) throws NoSuchMethodException {
37 visitTime = new Date(); // 当前时间就是开始访问的类
38 clazz = jp.getTarget().getClass(); // 具体访问的类
39 String methodName = jp.getSignature().getName(); // 获取访问方法名称
40 Object[] args = jp.getArgs(); // 获取访问方法参数
41
42 // 获取具体执行方法Method对象
43 if (args==null || args.length==0){
44 method = clazz.getMethod(methodName);
45 } else {
46 Class[] classArgs = new Class[args.length];
47 for (int i=0;i<args.length;i++){
48 classArgs[i] = args[i].getClass();
49 }
50 method = clazz.getMethod(methodName,classArgs);
51 }
52 }
53
54 // 后置通知
55 @After("execution(* club.nipengfei.ssm.controller.*.*(..))")
56 public void doAfter(JoinPoint jp) throws Exception {
57
58 // 获取访问时长
59 long time = new Date().getTime()-visitTime.getTime();
60
61 String url = "";
62 // 获取url
63 if (clazz != null && method !=null && clazz!=LogAop.class){
64 // 获取类的@RequestMapping("/orders")
65 RequestMapping clazzAnnotation =(RequestMapping) clazz.getAnnotation(RequestMapping.class);
66 if (clazzAnnotation != null){
67 String[] classValue = clazzAnnotation.value();
68 // 获取方法上的@RequestMapping("xxx")
69 RequestMapping methodAnnotation = method.getAnnotation(RequestMapping.class);
70 if (methodAnnotation != null){
71 String[] methodValue = methodAnnotation.value();
72 url=classValue[0]+methodValue[0];
73
74 // 获取IP地址
75 String ip = request.getRemoteAddr();
76
77 // 获取当前操作的用户
78 SecurityContext context = SecurityContextHolder.getContext();
79 User user =(User) context.getAuthentication().getPrincipal();
80 String username = user.getUsername();
81
82 // 将日志相关信息封装到SysLog对象
83 SysLog sysLog = new SysLog();
84 sysLog.setExecutionTime(time);
85 sysLog.setIp(ip);
86 sysLog.setMethod("[类名] "+clazz.getName()+"[方法名] "+method.getName());
87 sysLog.setUrl(url);
88 sysLog.setUsername(username);
89 sysLog.setVisitTime(visitTime);
90
91 // 调用service完成操作
92 sysLogService.save(sysLog);
93 }
94 }
95
96 }
97 }
98 }
1.3在service.impl包下新建一个SysLogServiceImpl类,生成一个save方法将SysLog类对象放到数据表中
1 package club.nipengfei.ssm.service.impl;
2
3 import club.nipengfei.ssm.dao.ISysLogDao;
4 import club.nipengfei.ssm.domain.SysLog;
5 import club.nipengfei.ssm.service.ISysLogService;
6 import org.springframework.beans.factory.annotation.Autowired;
7 import org.springframework.stereotype.Service;
8 import org.springframework.transaction.annotation.Transactional;
9
10 import java.util.List;
11
12 @Service
13 @Transactional
14 public class SysLogServiceImpl implements ISysLogService {
15
16 @Autowired
17 private ISysLogDao sysLogDao;
18
19 @Override
20 public void save(SysLog sysLog) throws Exception {
21 sysLogDao.save(sysLog);
22 }
23
24 }
1.4在dao包下新建ISysLogDao接口
1 package club.nipengfei.ssm.dao;
2
3 import club.nipengfei.ssm.domain.SysLog;
4 import org.apache.ibatis.annotations.Insert;
5 import org.apache.ibatis.annotations.Select;
6
7 import java.util.List;
8
9 public interface ISysLogDao {
10
11 @Insert("insert into syslog(visitTime,username,ip,url,executionTime,method) values(#{visitTime},#{username},#{ip},#{url},#{executionTime},#{method})")
12 public void save(SysLog sysLog) throws Exception;
13
14 }
1.5存在的问题
当点击订单管理时发现,不能正常访问

查看资料发现因为该findAll方法传入的形参是int类型,而我们的切面类通过反射获取该类的方法时传入的参数Integer类型。将findAll方法的int改为Integer,发现能正常访问了。
2.将日志信息展示到页面上
流程分析图:

2.1在ISysLogDao接口中生成一个findAll方法
1 package club.nipengfei.ssm.dao;
2
3 import club.nipengfei.ssm.domain.SysLog;
4 import org.apache.ibatis.annotations.Insert;
5 import org.apache.ibatis.annotations.Select;
6
7 import java.util.List;
8
9 public interface ISysLogDao {
10
11 @Insert("insert into syslog(visitTime,username,ip,url,executionTime,method) values(#{visitTime},#{username},#{ip},#{url},#{executionTime},#{method})")
12 public void save(SysLog sysLog) throws Exception;
13
14 @Select("select * from sysLog")
15 List<SysLog> findAll() throws Exception;
16 }
2.2在SysLogServiceImpl类内调用上面方法
1 package club.nipengfei.ssm.service.impl;
2
3 import club.nipengfei.ssm.dao.ISysLogDao;
4 import club.nipengfei.ssm.domain.SysLog;
5 import club.nipengfei.ssm.service.ISysLogService;
6 import org.springframework.beans.factory.annotation.Autowired;
7 import org.springframework.stereotype.Service;
8 import org.springframework.transaction.annotation.Transactional;
9
10 import java.util.List;
11
12 @Service
13 @Transactional
14 public class SysLogServiceImpl implements ISysLogService {
15
16 @Autowired
17 private ISysLogDao sysLogDao;
18
19 @Override
20 public void save(SysLog sysLog) throws Exception {
21 sysLogDao.save(sysLog);
22 }
23
24 @Override
25 public List<SysLog> findAll() throws Exception {
26 return sysLogDao.findAll();
27 }
28 }
2.3在controller包下新建一个SysLogController类
1 package club.nipengfei.ssm.controller;
2
3 import club.nipengfei.ssm.domain.SysLog;
4 import club.nipengfei.ssm.service.ISysLogService;
5 import org.springframework.beans.factory.annotation.Autowired;
6 import org.springframework.stereotype.Controller;
7 import org.springframework.web.bind.annotation.RequestMapping;
8 import org.springframework.web.servlet.ModelAndView;
9
10 import java.util.List;
11
12 @Controller
13 @RequestMapping("/sysLog")
14 public class SysLogController {
15
16 @Autowired
17 private ISysLogService sysLogService;
18
19 @RequestMapping("/findAll.do")
20 public ModelAndView findAll() throws Exception {
21 ModelAndView mv = new ModelAndView();
22 List<SysLog> sysLogList = sysLogService.findAll();
23 mv.addObject("sysLogs",sysLogList);
24 mv.setViewName("syslog-list");
25 return mv;
26 }
27 }
http://market.szonline.net/amaz/22890.html
http://market.szonline.net/amaz/22889.html
http://market.szonline.net/amaz/22888.html
http://market.szonline.net/amaz/22887.html
http://market.szonline.net/amaz/22886.html
http://market.szonline.net/amaz/22885.html
http://market.szonline.net/amaz/22884.html
http://market.szonline.net/amaz/22883.html
http://market.szonline.net/amaz/22882.html
http://market.szonline.net/amaz/22881.html
http://market.szonline.net/amaz/22880.html
http://market.szonline.net/amaz/22879.html
http://market.szonline.net/amaz/22878.html
http://market.szonline.net/amaz/22877.html
http://market.szonline.net/amaz/22876.html
http://market.szonline.net/amaz/22875.html
http://market.szonline.net/amaz/22874.html
http://market.szonline.net/amaz/22873.html
http://market.szonline.net/amaz/22872.html
http://market.szonline.net/amaz/22871.html
http://market.szonline.net/amaz/22870.html
http://market.szonline.net/amaz/22869.html
http://market.szonline.net/amaz/22868.html
http://market.szonline.net/amaz/22867.html
http://market.szonline.net/amaz/22866.html
http://market.szonline.net/amaz/22865.html
http://market.szonline.net/amaz/22864.html
http://market.szonline.net/amaz/22863.html
http://market.szonline.net/amaz/22862.html
http://market.szonline.net/amaz/22861.html
http://market.szonline.net/amaz/22860.html
http://market.szonline.net/amaz/22859.html
http://market.szonline.net/amaz/22858.html
http://market.szonline.net/amaz/22857.html
http://market.szonline.net/amaz/22856.html
http://market.szonline.net/amaz/22852.html
http://market.szonline.net/amaz/22847.html
http://market.szonline.net/amaz/22842.html
http://market.szonline.net/amaz/22837.html
http://market.szonline.net/amaz/22832.html
http://market.szonline.net/amaz/22829.html
http://market.szonline.net/amaz/22828.html
http://market.szonline.net/amaz/22827.html
http://market.szonline.net/amaz/22826.html
http://market.szonline.net/amaz/22825.html
