拦截器实现增删改操作的日志管理(整体思路)

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

此文接上篇拦截器实现增删改操作的日志管理;由于上篇文章讲述得较为简略,这里做下详细说明。

前言

项目的数据库设计有表:

  • T_employee:用户表
  • T_group:用户组表
  • T_group_employee:用户及组关联表
  • T_menu:菜单表
  • T_element:操作元素表
  • T_group_authority:组别权限表

menu用来前端管理平台的树形菜单渲染,而element表中有属性url:用来对应访问的接口的url)用来呈现前端的各个接口按钮;也每个角色有对应的meunelementmenuelement是一对多的关系,此时实现日志管理就有如下较为简便的操作了,原理大致是:通过访问的url获取elementmenu,插入日志表中,看起来很简单,但由于个人较差,遇到了不少阻碍。

具体实现

本文只提供思路,不提供完整代码实现。

首先是拦截器:

/**
 * @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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值