1.正常业务的controller中接口添加name,用户描述接口信息,让我们知道进入了什么接口,做什么,也就是需要拦截的接口
@RequestMapping(value = "/list",name ="查询所有企业数据")
public String findAll(@RequestParam(defaultValue = "1",name = "page") int pageNum,@RequestParam(defaultValue = "2") int pageSize){
// List<Company> companyList = companyService.findAll();
// PageBean pageBean = companyService.findPage(pageNum,pageSize);
PageInfo<Company> pageBean = companyService.findPage(pageNum,pageSize);
request.setAttribute("page",pageBean);
return "company/company-list";
}
2.日志对外只有一个查询的controller接口
@Controller
@RequestMapping("/system/log")
public class SysLogController extends BaseController {
@Autowired
private SysLogService sysLogService;
@RequestMapping(value = "/list",name ="查询所有日志数据")
public String findAll(@RequestParam(defaultValue = "1",name = "page") int pageNum,@RequestParam(defaultValue = "10") int pageSize){
// 当前登录人所属部门的id
PageInfo<SysLog> pageBean = sysLogService.findPage(getCompanyId(),pageNum,pageSize);
request.setAttribute("page",pageBean);
return "system/log/log-list";
}
}
3.日志实体类,用户记录日志保存的信息
@Data
public class SysLog implements Serializable {
private String id;
private String userName;
private String ip;
private Date time; //操作时间
private String method; //方法名称 findAll toAdd toUpdate delete
private String action; //方法名称的中文解释 这个值取自方法上RequestMapping注解的name值
private String companyId;
private String companyName;
}
4.提供两个日志的方法,① 储存②查询 ,不需要修改和删除
4.1service接口
public interface SysLogService {
//根据公司id和分页信息查询日志信息
public PageInfo<SysLog> findPage(String companyId,int page,int size);
public void save(SysLog sysLog);
}
4.2serviceImpl接口实现类
@Service
public class SysLogServiceImpl implements SysLogService {
@Autowired
private SysLogDao sysLogDao;
//查询日志信息
@Override
public PageInfo<SysLog> findPage(String companyId,int page,int size) {
PageHelper.startPage(page,size);
List<SysLog> list = sysLogDao.findAll(companyId);
return new PageInfo<SysLog>(list,5);
}
//保存日志信息
@Override
public void save(SysLog sysLog) {
sysLogDao.save(sysLog);
}
}
4.3dao接口
public interface SysLogDao {
//查询全部
List<SysLog> findAll(String companyId);
//添加
void save(SysLog log);
}
4.4dao的xml映射 sql语句
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper SYSTEM "http://mybatis.org/dtd/mybatis-3-mapper.dtd" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN">
-<mapper namespace="cn.itcast.dao.system.SysLogDao">
//数据字段入属性不一致,进行映射
-<resultMap type="cn.itcast.domain.system.SysLog" id="BaseResultMap">
<id property="id" column="id"/>
<result property="userName" column="user_name"/>
<result property="ip" column="ip"/>
<result property="time" column="time"/>
<result property="method" column="method"/>
<result property="action" column="action"/>
<result property="companyId" column="company_id"/>
<result property="companyName" column="company_name"/>
</resultMap>
<!--查询全部-->
<select id="findAll" resultMap="BaseResultMap" parameterType="string">select * from st_sys_log where company_id=#{companyId} order by time desc </select>
<!--添加-->
<insert id="save" parameterType="cn.itcast.domain.system.SysLog">insert into st_sys_log (id, user_name, ip, time, method, action,company_id,company_name)values (#{id}, #{userName}, #{ip}, #{time}, #{method},#{action},#{companyId},#{companyName}) </insert>
</mapper>
5.springAop日志实现介绍
6.定义切面类,使用@Around环绕通知,记录操作日志
@Component
@Aspect
public class LogAspect {
@Autowired
private SysLogService sysLogService;
@Autowired
private HttpSession session;
@Autowired
private HttpServletRequest request;
@Around("execution(* cn.itcast.controller.*.*.*(..))")
public Object saveLog(ProceedingJoinPoint pjp) throws Throwable {
SysLog sysLog = new SysLog();
// 可以直接赋值的属性:
sysLog.setId(UUID.randomUUID().toString());
sysLog.setTime(new Date());
// 跟当前登录人有关系的属性:
User user = (User) session.getAttribute("loginUser");
if(user!=null){
sysLog.setUserName(user.getUserName());
sysLog.setCompanyId(user.getCompanyId());
sysLog.setCompanyName(user.getCompanyName());
sysLog.setIp(request.getRemoteAddr()); // ip地址
}
// 取值比较复杂的属性:
MethodSignature signature = (MethodSignature) pjp.getSignature(); // 方法签名中具有方法和注解的相关内容
Method method = signature.getMethod(); // 从method方法对象中获取方法名称
String name = method.getName();
sysLog.setMethod(name); //方法名
// 请求的方法参数值
Object[] args = joinPoint.getArgs();
// 请求的方法参数名称
LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
String[] paramNames = u.getParameterNames(method);
if (args != null && paramNames != null)
{
String params = "";
for (int i = 0; i < args.length; i++) {
params += " " + paramNames[i] + ": " + args[i];
}
}
// 判断方法上是否有RequestMapping注解
if(method.isAnnotationPresent(RequestMapping.class)){
RequestMapping annotation = method.getAnnotation(RequestMapping.class); //从方法中获取RequestMapping注解对象
String action = annotation.name(); // 获取注解上的name属性值
sysLog.setAction(action); //从方法注解上去name属性
}
sysLogService.save(sysLog);
return pjp.proceed();//执行原方法
}
}