通过自定义拦截器实现操作日志记录

该代码示例展示了如何在SpringBoot应用中使用自定义拦截器Interceptor来在Controller方法执行前后记录操作日志。拦截器检查请求方法上的注解,根据API操作类型分类(查询、新增、更新、删除),并根据请求状态决定日志的保存(成功或失败)。此外,还包括了一个自定义注解LogAnnotation用于标记可忽略的日志以及数据库表结构,存储日志信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码:

@Component

public class Interceptor implements HadlerInterceptor{

@Autwired

//操作日志service

private static service;

public @PostConstruct  void  init(){service =操作日志service }

一.访问controller方法前执行拦截

public boolean  preHandle (HttpservletRequset request ,HttpServletResponse response,Object bij)throes Exception{

//查询请求方法是否有注解,,没有不拦截,

String[] getValue = {"查询","搜索","接收"};

String[] addValue ={"新增"};

String[] updateValue ={"更新","修改"};

String[] deleteValue ={"删除"};

if(obj instanceof HandlerMethod){

        HandlerMethod hand = (HandlerMethod )obj;

        LogAnnotation auditLog = hand.getMethod.getAnnottation(LogAnnotation.class);

        ApiOperation operaLog = hand.getMethod.getAnnottation(ApiOperation.class);

        if(auditLog  != null && auditLog .ignore() == true){

        log.info("访问方法无需拦截");

                reture true;

        }else{

                String value = '';

                String body = '';

                StringBuffer url = requst.getRequestURL();

                String  path = request.getServletPath();

                String ip = this.getIP(request);

                String method = requset.getMethod();

                if("GET".equals(method)){

                        value= "查询";

                  }else{

                        if(operaLog  != null){

                               value = operaLog.value();

                                if(StringUtils.isNotBlank(value)){

                                        if(value.length() > 4){

                                                if(containsWords(value,getValue)){

                                                        value = "查询";

                                                        }

                                                if(containsWords(value,addValue){

                                                        value = "新增";

                                                        }

                                                if(containsWords(value,updateValue){

                                                         value = "修改";

                                                        }

                                                if(containsWords(value,deleteValue){

                                                         value = "删除";

                                                        }

                                                   }

                                                }else{

                                                        value= method;

                                           }

                                  }

                         }

                        if(StringUtils.isBlank(value) || value.length() > 4){

                                value= method;

                        }

                        log.info(new Date() + "--preHandle:" + url);

                        int status = response.getStatus();

                        if(status != 200){

                                //调用service添加接口,添加失败操作日志

                                service.addAuditLog(path,value,"失败",body,ip);

                                return true;

                                }

                        if(request instanceof XXSRequestWrapper){

                                XXSRequestWrapper wrapper = (XXSRequestWrapper)request;

                                body =  wrapper.getBody();

                                }

                             service.addAuditLog(path,value,"成功",body,ip);

                             return true;

                        }

                }else if(handler instanceof ResourceHttpRequestHandler){

                         return true;

                }

                 return false;

        

}

二.访问controller方法后执行

public void postHandle(HttpservletRequset request ,HttpServletResponse response,Object bij,ModelAndView view)

       int status =  response.getstatus();

       if(status != 200){

             SreAuditLog auditLog  =    service.queryNewLog();

             auditLog.setActionResult("失败");

             service.update(auditLog);

        }

三.获取ip

private String getIp(HttpservletRequest request){

        List<String>  ip = Stream.of("X-Forwarded-For","Proxy-Client-Ip","WL-Proxy-Client-Ip","HTTP_CLIENT_IP","X-Real-Ip").collect(Collectors.toList());

        for(String ipHead : ip){

                if(chackIP(request.getHeader(iphead))){

                        return request.getHeader(iphead).split(",")[0];

                }

        }

        return "0:0:0:0:0:0:0:1".equals(request.getRemoteAddr()) ? "127.0.0.1" : request.getRemoteAddr();

}

//检查IP存在

private boolean chackIP(String ip){

            return !(null == ip || ip.length() }} "unknown".equalsIgnoreCase(ip));

}

}

补充:自定义注解:

        @Target(ElementTpye.METHOD)

        @Retention(RetentionPolicy.RUNTIME)

        public @interface LogAnnotation{

                String name() default "";

                String action() default "";

                String ignore() default "";

        }

数据库表:

        主键id,创建时间,userName,ip,action_type,action_obj, action_result,action_detail,邮箱

       

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值