此文接上篇拦截器实现增删改操作的日志管理;由于上篇文章讲述得较为简略,这里做下详细说明。
前言
项目的数据库设计有表:
- T_employee:用户表
- T_group:用户组表
- T_group_employee:用户及组关联表
- T_menu:菜单表
- T_element:操作元素表
- T_group_authority:组别权限表
menu
用来前端管理平台的树形菜单渲染,而element
(表中有属性url:用来对应访问的接口的url)用来呈现前端的各个接口按钮;也每个角色有对应的meun
和element
,menu
与element
是一对多的关系,此时实现日志管理就有如下较为简便的操作了,原理大致是:通过访问的url获取element
与menu
,插入日志表中,看起来很简单,但由于个人较差,遇到了不少阻碍。
具体实现
本文只提供思路,不提供完整代码实现。
首先是拦截器:
/**
* @Author fuzihao
* @Date 2019/8/27 16:11
*/
@Slf4j
public class OperationLogInterceptor extends HandlerInterceptorAdapter {
private ILogService logService = (ILogService) SpringContextUtil.getBean("logServiceImpl");
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if(handler instanceof HandlerMethod) {
HandlerMethod method = (HandlerMethod) handler;
String methodType = request.getMethod();
if(StringUtils.equalsIgnoreCase(HttpMethodEnum.POST.name(), methodType)
|| StringUtils.equalsIgnoreCase(HttpMethodEnum.DELETE.name(), methodType)
|| StringUtils.equalsIgnoreCase(HttpMethodEnum.PUT.name(), methodType)){
insertLog(request,method);
}
}
return true;
}
/**
* 根据http请求类型插入日志记录
* @param request
* @param handlerMethod
*/
private void insertLog(HttpServletRequest request,HandlerMethod handlerMethod) throws Exception{
//即通过request获取url,而通过访问的url,来获取操作的element和menu,用以插入日志表
getMenuOperation(request);
//同时,项目还需要获取RequestBody注解的参数(即put、post请求等的参数,由于不在url上,需要手动获取)
//注意:这里埋下了雷
String requestBody = new BodyReaderHttpServletRequestWrapper(request).getBodyString();
}
}
}
拦截器也在WebConfig
里配置,上篇文章也提到了,这里不做赘述。
public String getBodyString(HttpServletRequest request) throws IOException {
StringBuilder sb = new StringBuilder(