此文接上篇拦截器实现增删改操作的日志管理;由于上篇文章讲述得较为简略,这里做下详细说明。
前言
项目的数据库设计有表:
- 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();
InputStream inputStream

本文详细介绍了如何使用拦截器实现增删改操作的日志管理。通过分析项目中的数据库表结构,阐述了利用URL匹配获取操作信息并插入日志表的思路。在具体实现部分,提到在拦截器中遇到的问题——请求体只能读取一次,为解决这个问题,创建了`BodyReaderHttpServletRequestWrapper`并添加过滤器,确保流可以被正确处理。整个日志管理系统在拦截器和过滤器的配合下得以完成。
最低0.47元/天 解锁文章
986

被折叠的 条评论
为什么被折叠?



