Java SSM 项目实战 day09 SSMAOP日志
发布日期:2021-06-29 15:04:26 浏览次数:3 分类:技术文章

本文共 15232 字,大约阅读时间需要 50 分钟。

一、数据库与表结构

1、日志表信息描述sysLog

在这里插入图片描述

2、sql语句

CREATE TABLE sysLog(	id VARCHAR2(32) default SYS_GUID() PRIMARY KEY,	visitTime timestamp,	username VARCHAR2(50),	ip VARCHAR2(30),	url VARCHAR2(50),	executionTime int,	method VARCHAR2(200))

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、创建对应的实体类

在这里插入图片描述

在这里插入图片描述

package com.itzheng.ssm.domain;import java.util.Date;public class SysLog {
private String id; private Date visitTime; private String visitTimeStr; private String username; private String ip; private String url; private Long executionTime; private String method; public SysLog() {
} public SysLog(String id, Date visitTime, String visitTimeStr, String username, String ip, String url, Long executionTime, String method) {
this.id = id; this.visitTime = visitTime; this.visitTimeStr = visitTimeStr; this.username = username; this.ip = ip; this.url = url; this.executionTime = executionTime; this.method = method; } public String getId() {
return id; } public void setId(String id) {
this.id = id; } public Date getVisitTime() {
return visitTime; } public void setVisitTime(Date visitTime) {
this.visitTime = visitTime; } public String getVisitTimeStr() {
return visitTimeStr; } public void setVisitTimeStr(String visitTimeStr) {
this.visitTimeStr = visitTimeStr; } public String getUsername() {
return username; } public void setUsername(String username) {
this.username = username; } public String getIp() {
return ip; } public void setIp(String ip) {
this.ip = ip; } public String getUrl() {
return url; } public void setUrl(String url) {
this.url = url; } public Long getExecutionTime() {
return executionTime; } public void setExecutionTime(Long executionTime) {
this.executionTime = executionTime; } public String getMethod() {
return method; } public void setMethod(String method) {
this.method = method; } @Override public String toString() {
return "SysLog{" + "id='" + id + '\'' + ", visitTime=" + visitTime + ", visitTimeStr='" + visitTimeStr + '\'' + ", username='" + username + '\'' + ", ip='" + ip + '\'' + ", url='" + url + '\'' + ", executionTime=" + executionTime + ", method='" + method + '\'' + '}'; }}

二、基于AOP日志处理(记录日志信息)

在这里插入图片描述

1、在控制层创建LogAop类

在这里插入图片描述

修改web.xml,添加一下内容
在这里插入图片描述

org.springframework.web.context.request.RequestContextListener

LogAop类

在这里插入图片描述

package com.itzheng.ssm.controller;import com.itzheng.ssm.domain.SysLog;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.core.context.SecurityContext;import org.springframework.security.core.context.SecurityContextHolder;import org.springframework.security.core.userdetails.User;import org.springframework.stereotype.Component;import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;import java.lang.annotation.Annotation;import java.lang.reflect.Method;import java.util.Date;@Component@Aspectpublic class LogAop {
@Autowired private HttpServletRequest requset; private Date visitTime;//开始的时间 private Class clazz;//访问的类 private Method method;//访问的方法 //前置通知 主要是获取我们的开始的时间,执行类的哪一个,执行的是哪一个方法 @Before("execution(* com.itzheng.ssm.controller.*.*(..))")//拦截controller类当中的所有的方法 public void doBefore(JoinPoint jp) throws NoSuchMethodException {
visitTime = new Date();//当前时间就是开始访问的时间 clazz = jp.getTarget().getClass();//获取当前具体要访问的类 String methodName = jp.getSignature().getName();//获取当前访问具体方法的名称 Object[] args = jp.getArgs();//获取访问方法的参数 //以下代码获取到了具体执行的方法的method对象 if(args == null || args.length == 0){
method = clazz.getMethod(methodName);//只能获取无参数的方法 }else {
Class[] classArgs = new Class[args.length]; for (int i = 0; i < args.length;i++){
classArgs[i] = args[i].getClass();//获取每一个方法参数,放到classArgs数组当中 } method = clazz.getMethod(methodName,classArgs);//只能获取无参数的方法 } } //后置通知 @After("execution(* com.itzheng.ssm.controller.*.*(..))")//拦截controller类当中的所有的方法 public void doAfter(JoinPoint jp){
long time = new Date().getTime()-visitTime.getTime();//获取了访问的时长 String url = ""; //获取url if( clazz != null && method != null && clazz != LogAop.class){
//1.获取类上的这个注解@RequestMapping("/orders")的值 RequestMapping classAnnotation = (RequestMapping)clazz.getAnnotation(RequestMapping.class); if(classAnnotation != null){
String[] classValue = classAnnotation.value();//获取到了/orders //2、获取方法上的@RequestMapping(xxx) RequestMapping methodAnnotation = method.getAnnotation(RequestMapping.class); if(methodAnnotation != null){
String [] methodValue = methodAnnotation.value(); url = classValue[0] + methodValue[0]; } } } //获取访问的IP地址 String ip = requset.getRemoteAddr(); //如何获取当前操作的用户 SecurityContext context = SecurityContextHolder.getContext();//从上下文当中获取当前登录的用户 User user = (User)context.getAuthentication().getPrincipal(); String username = user.getUsername(); //将日志相关信息分装到SysLog对象当中 SysLog sysLog = new SysLog(); sysLog.setExecutionTime(time);//执行时长 sysLog.setIp(ip); sysLog.setMethod("[类名] "+clazz.getName()+"[方法名] " + method.getName()); sysLog.setUrl(url); sysLog.setUsername(username); sysLog.setVisitTime(visitTime); //调用Service完成数据库的插入操作(即日志的记录操作) }}

2、创建对应的Service接口和对应的实现类

(1)ISysLogService接口

在这里插入图片描述

package com.itzheng.ssm.service;import com.itzheng.ssm.domain.SysLog;public interface ISysLogService {
public void save(SysLog sysLog) throws Exception;}

(2)SysLogServiceImpl

在这里插入图片描述

在这里插入图片描述

package com.itzheng.ssm.service.impl;import com.itzheng.ssm.domain.SysLog;import com.itzheng.ssm.service.ISysLogService;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;@Service@Transactionalpublic class SysLogServiceImpl implements ISysLogService {
@Override public void save(SysLog sysLog) throws Exception {
}}

3、创建对应的DAO

在这里插入图片描述

在这里插入图片描述

package com.itzheng.ssm.dao;import com.itzheng.ssm.domain.SysLog;import org.apache.ibatis.annotations.Insert;public interface ISysLogDao {
@Insert("") public void save(SysLog sysLog) throws Exception ;}

4、完善上述所有的业务以及dao

(1)SysLogServiceImpl

在这里插入图片描述

package com.itzheng.ssm.service.impl;import com.itzheng.ssm.dao.ISysLogDao;import com.itzheng.ssm.domain.SysLog;import com.itzheng.ssm.service.ISysLogService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;@Service@Transactionalpublic class SysLogServiceImpl implements ISysLogService {
@Autowired private ISysLogDao sysLogDao; @Override public void save(SysLog sysLog) throws Exception {
sysLogDao.save(sysLog); }}

(2)LogAop

在这里插入图片描述

@Autowired    private ISysLogService sysLogService;

在这里插入图片描述

//调用Service完成数据库的插入操作(即日志的记录操作)        sysLogService.save(sysLog);

(3)ISysLogDao

在这里插入图片描述

package com.itzheng.ssm.dao;import com.itzheng.ssm.domain.SysLog;import org.apache.ibatis.annotations.Insert;public interface ISysLogDao {
@Insert("insert into syslog(visitTime,username,ip,url,executionTime,method) values(#{visitTime},#{username},#{ip},#{url},#{executionTime},#{method})") public void save(SysLog sysLog) throws Exception ;}

(4)完善LogAop类

在这里插入图片描述

package com.itzheng.ssm.controller;import com.itzheng.ssm.domain.SysLog;import com.itzheng.ssm.service.ISysLogService;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpRequest;import org.springframework.http.server.ServletServerHttpRequest;import org.springframework.security.core.context.SecurityContext;import org.springframework.security.core.context.SecurityContextHolder;import org.springframework.security.core.userdetails.User;import org.springframework.stereotype.Component;import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;import java.lang.annotation.Annotation;import java.lang.reflect.Method;import java.util.Date;@Component@Aspectpublic class LogAop {
@Autowired private HttpServletRequest request; @Autowired private ISysLogService sysLogService; private Date visitTime; //开始时间 private Class clazz; //访问的类 private Method method;//访问的方法 //前置通知 主要是获取开始时间,执行的类是哪一个,执行的是哪一个方法 @Before("execution(* com.itzheng.ssm.controller.*.*(..))") public void doBefore(JoinPoint jp) throws NoSuchMethodException {
visitTime = new Date();//当前时间就是开始访问的时间 clazz = jp.getTarget().getClass(); //具体要访问的类 String methodName = jp.getSignature().getName(); //获取访问的方法的名称 Object[] args = jp.getArgs();//获取访问的方法的参数 //获取具体执行的方法的Method对象 if (args == null || args.length == 0) {
method = clazz.getMethod(methodName); //只能获取无参数的方法 } else {
Class[] classArgs = new Class[args.length]; for (int i = 0; i < args.length; i++) {
classArgs[i] = args[i].getClass(); } clazz.getMethod(methodName, classArgs); } } //后置通知 @After("execution(* com.itzheng.ssm.controller.*.*(..))") public void doAfter(JoinPoint jp) throws Exception {
long time = new Date().getTime() - visitTime.getTime(); //获取访问的时长 String url = ""; //获取url if (clazz != null && method != null && clazz != LogAop.class) {
//1.获取类上的@RequestMapping("/orders") RequestMapping classAnnotation = (RequestMapping) clazz.getAnnotation(RequestMapping.class); if (classAnnotation != null) {
String[] classValue = classAnnotation.value(); //2.获取方法上的@RequestMapping(xxx) RequestMapping methodAnnotation = method.getAnnotation(RequestMapping.class); if (methodAnnotation != null) {
String[] methodValue = methodAnnotation.value(); url = classValue[0] + methodValue[0]; //获取访问的ip String ip = request.getRemoteAddr(); //String ip = "192.168.153.2012"; //获取当前操作的用户 SecurityContext context = SecurityContextHolder.getContext();//从上下文中获了当前登录的用户 User user = (User) context.getAuthentication().getPrincipal(); String username = user.getUsername(); //将日志相关信息封装到SysLog对象 SysLog sysLog = new SysLog(); sysLog.setExecutionTime(time); //执行时长 sysLog.setIp(ip); sysLog.setMethod("[类名] " + clazz.getName() + "[方法名] " + method.getName()); sysLog.setUrl(url); sysLog.setUsername(username); sysLog.setVisitTime(visitTime); //调用Service完成操作 sysLogService.save(sysLog); } } } }}

(5)修改OrdersController当中findAll方法参数

在这里插入图片描述

@RequestMapping("/findAll.do")    @Secured("ROLE_ADMIN")    public ModelAndView findAll(@RequestParam(name = "page", required = true, defaultValue = "1") Integer page,                                @RequestParam(name = "size", required = true, defaultValue = "4") Integer size) throws Exception {

(6)运行测试

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、基于AOP日志的查询

在这里插入图片描述

(1)创建syslog-list.jsp

在这里插入图片描述

<%@ page language="java" contentType="text/html; charset=UTF-8"	pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
数据 - AdminLTE2定制版

日志管理 全部日志

列表

ID 访问时间 访问用户 访问IP 资源URL 执行时间 访问方法
${syslog.id} ${syslog.visitTimeStr } ${syslog.username } ${syslog.ip } ${syslog.url} ${syslog.executionTime}毫秒 ${syslog.method}

(2)创建SysLogController

在这里插入图片描述

在这里插入图片描述

package com.itzheng.ssm.controller;import com.itzheng.ssm.domain.SysLog;import com.itzheng.ssm.service.ISysLogService;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 java.util.List;@Controller@RequestMapping("/sysLog")public class SysLogController {
@Autowired private ISysLogService sysLogService; @RequestMapping("/findAll.do") public ModelAndView findAll() throws Exception{
ModelAndView mv = new ModelAndView(); List
sysLogList = sysLogService.findAll(); return mv; }}

(3)ISysLogService以及SysLogServiceImpl当中

在这里插入图片描述

List
findAll()throws Exception;

在这里插入图片描述

@Override    public List
findAll() throws Exception {
return sysLogDao.findAll(); }

在这里插入图片描述

(4)ISysLogDao当中

在这里插入图片描述

@Select("select * from sysLog")    List
findAll() throws Exception ;

(5)完善SysLogController

在这里插入图片描述

package com.itzheng.ssm.controller;import com.itzheng.ssm.domain.SysLog;import com.itzheng.ssm.service.ISysLogService;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 java.util.List;@Controller@RequestMapping("/sysLog")public class SysLogController {
@Autowired private ISysLogService sysLogService; @RequestMapping("/findAll.do") public ModelAndView findAll() throws Exception{
ModelAndView mv = new ModelAndView(); List
sysLogList = sysLogService.findAll(); mv.addObject("sysLogs",sysLogList); mv.setViewName("syslog-list"); return mv; }}

(6)运行测试项目

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

转载地址:https://code100.blog.csdn.net/article/details/117930341 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C/C++语言数据结构快速入门(二)(代码解析+内容解析)顺序表
下一篇:Java SSM 项目实战 day08 方法级别的权限操作 服务器端的权限控制(JSR-250注解)(支持表达式的注解)(@Secured)以及页面端的权限控制

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年04月30日 13时38分54秒