spring Boot使用AOP统一处理Web请求日志记录

时间:2022-09-10 09:53:47

1.使用spring boot实现一个拦截器

  1、引入依赖

  

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
 
 2、创建拦截器类(在该类中,定义了拦截规则:拦截com.xjj.web.controller包下面的所有类中,有@RequestMapping注解的方法。):
 

/**
* 拦截器:记录O2O调用接口记录
*/
@Aspect
@Component
public class O2oInterfaceInterceptor {

  @Autowired
  private SysCallInterfaceLogRepository sysCallInterfaceLogRepository;
  @Autowired
  private SysEmailService sysEmailService;
  @Autowired
  private SysPropertyService sysPropertyService;

  private static Logger logger = LoggerFactory.getLogger(O2oInterfaceInterceptor.class);

/**
* 定义拦截规则:拦截com.ctop.wms.interfaces.ActivitiInterfaces包下面的所有类中,有@RequestMapping注解的方法。

*/
  @Pointcut("execution(* com.ctop.wms.interfaces.ActivitiInterfaces.*(..)) and @annotation(org.springframework.web.bind.annotation.RequestMapping)")
  public void controllerMethodPointcut() {}

  @Around("controllerMethodPointcut()")
  public Object controllerMethodPointcutInterceptor(ProceedingJoinPoint pjp) {
    return Interceptor(pjp);
  }
/**
* 拦截器具体实现
* @param pjp
* @return JsonResult(被拦截方法的执行结果)
*/
  public Object Interceptor(ProceedingJoinPoint pjp){
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attributes.getRequest();

    MethodSignature signature = (MethodSignature) pjp.getSignature();
    Method method = signature.getMethod(); //获取被拦截的方法
    String methodName = method.getName(); //获取被拦截的方法名
    String ip = request.getRemoteAddr();
    String url = request.getRequestURL().toString();
    logger.info("被调接口,请求开始----------------------------");
    logger.info("ip : " + request.getRemoteAddr());
    logger.info("url : " + request.getRequestURL().toString());
    logger.info("methodName : " + methodName);

    Object result = "";
    String param = Arrays.toString(pjp.getArgs());

    logger.info("param : " + param);
    SysCallInterfaceLog log = new SysCallInterfaceLog();
    log.setExt1("called");// 被叫
    log.setRequestIp(ip);
    log.setRequestMethod(methodName);
    log.setRequestParam(param);
    log.setRequestUrl(url);

    try {
      // 一切正常的情况下,继续执行被拦截的方法
      result = pjp.proceed();
      String resultStr = "";
      if(result != null) {
        if(result instanceof String) {
          resultStr = (String) result;
        } else {
          Gson gson = new Gson();
          resultStr = gson.toJson(result);
        }
      }

      log.setResult(resultStr);
      logger.info("result : " + resultStr);
      logger.info("请求结束,请求成功");

      // 记录结果到数据库
      log.setSuccess("success");
      log = sysCallInterfaceLogRepository.save(log);
    } catch (Throwable e) {
      logger.info("请求结束,请求失败");
      // 记录结果到数据库, 并发送邮件
      log.setSuccess("fail");
      Gson gson = new Gson();
      String exceptionStr = gson.toJson(e);
      log.setResult(exceptionStr);

      SysProperty sysPropertyName= sysPropertyService.getSysProperty("o2o.wms.log.name");
      SysProperty sysPropertyEmail= sysPropertyService.getSysProperty("o2o.wms.log.email");
      log = sysCallInterfaceLogRepository.save(log);
      SysEmailDto sysEmailDto = new SysEmailDto();
      List<SysEmailInfoDto> sysEmailInfoDtoLs = new ArrayList<SysEmailInfoDto>();
      SysEmailInfoDto dtoDetails = new SysEmailInfoDto();
      if(sysPropertyName !=null && sysPropertyEmail !=null){
          dtoDetails.setReceiverEmail(sysPropertyEmail.getPropValue());
          dtoDetails.setReceiverName(sysPropertyName.getPropValue());
      }
      sysEmailDto.setTitle("O2O调用WMS接口失败日志!");
      sysEmailDto.setContent("调用:"+url+"失败!sys_Call_Interface_Log.Scil_Uuid="+log.getScilUuid()+",\n请求参数:"+param+",\n调用结果:"+exceptionStr);
      sysEmailInfoDtoLs.add(dtoDetails);
      sysEmailDto.setSysEmailInfoDto(sysEmailInfoDtoLs);
      try {
        sysEmailService.addSysEmail(sysEmailDto);
      } catch (Exception e1) {
        e1.printStackTrace();
      }
    e.printStackTrace();
    throw new BusinessException(e, null, null);
   }
  return result;
  }

}

spring Boot使用AOP统一处理Web请求日志记录的更多相关文章

  1. spring boot使用AOP统一处理web请求

    为了保证服务的高可用,及时发现问题,迅速解决问题,为应用添加log是必不可少的. 但是随着项目的增大,方法增多,每个方法加单独加日志处理会有很多冗余 那在SpringBoot项目中如何统一的处理Web ...

  2. 46&period; Spring Boot中使用AOP统一处理Web请求日志

    在之前一系列的文章中都是提供了全部的代码,在之后的文章中就提供核心的代码进行讲解.有什么问题大家可以给我留言或者加我QQ,进行咨询. AOP为Aspect Oriented Programming的缩 ...

  3. Springboot中使用AOP统一处理Web请求日志

    title: Springboot中使用AOP统一处理Web请求日志 date: 2017-04-26 16:30:48 tags: ['Spring Boot','AOP'] categories: ...

  4. SpringBoot2&period;0 使用AOP统一处理Web请求日志(完整版)

    一,加入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  5. Spring Boot中使用AOP统一处理Web请求日志

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通 ...

  6. (转)Spring Boot中使用AOP统一处理Web请求日志

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通 ...

  7. 转&colon;Spring Boot中使用AOP统一处理Web请求日志

    在spring boot中,简单几步,使用spring AOP实现一个拦截器: 1.引入依赖: <dependency> <groupId>org.springframewor ...

  8. Spring Boot2&period;0之统一处理web请求日志

    试问,你的项目中,如果有几万个方法,你还这么写log.info("name"+name+",age"+age )日志么?low~ 所以用AOP呀 1.首先创建个 ...

  9. springboot Aop 统一处理Web请求日志

    1.增加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

随机推荐

  1. DHCP协议格式、DHCP服务搭建、DHCP协商交互过程入门学习

    相关学习资料 http://www.rfc-editor.org/rfc/rfc2131.txt http://baike.baidu.com/view/7992.htm?fromtitle=DHCP ...

  2. iOS UIView 快速修改 frame,

    在iOS开发布局修改 frame 时需要繁琐的代码实现,今天偶尔看到一播客说到快速修改的 frame 的方法,自己动手写了一遍实现代码. 快速实现主要通过 添加类目的方式,对UIView 控件添加了一 ...

  3. python杂乱有关类与对象

    在python的类中,一般里面的方法和属性默认都是publlic,如果要设为private,即自己访问,主要是根据命名方式来区分的,通过__  两个下划线加在名字前面,即为私有方法和私有属性 构造方法 ...

  4. 关于char与varchar,varchar2的区别

    http://zhidao.baidu.com/question/220360696.html?qbl=relate_question_0&word=char%BA%CDvarchar2%B5 ...

  5. iOS 图片水印、图片合成文字或图片实现

    这个需求可能有时候会碰到,比如自己的照片加版权,打水印等 网上的方法,有不少感觉不全对,或者需求不是特全,这里我总结了3种场景下的需求: 1.本地图片合成文字 2.本地图片合成图片 3.网络图片先下载 ...

  6. The Lisp Curse /Lisp魔咒

    The Lisp Curse /Lisp魔咒 http://winestockwebdesign.com/Essays/Lisp_Curse.html 英文出处 http://www.soimort. ...

  7. JavaScript对象与JSON字符串的相互转换

    JSON(JavaScript Object Notation) 是JavaScript编程语言的一个子集.正因JSON是JavaScript的一个子集,所以它可清晰的运用于此语言中. eval函数 ...

  8. ORACLE与SQL SERVER语法区别

    一.数据类型 ORACLE与SQL SERVER在数据类型的对比如下: SQL SERVER ORACLE 数字类型 DECIMAL[(P[, S])] NUMBER[(P[, S])] NUMERI ...

  9. JavaScript高级程序设计(第3版)学习笔记&&num;183&semi;第8章——浏览器对象模型BOM

    转自:http://www.shaoqun.com/a/43768.aspx 访问和操作浏览器窗口的模型称为浏览器对象模型BOM(Browser Object Model),但习惯上是把所有针对浏览器 ...

  10. Delphi开发Android的几个注意

    Delphi在Android开发中还不是很完善,也有一些修改,需要注意: 1.不要用IXMLDocument的SaveToStream, XML.Text等,用了OXML,QXML,VerySimpl ...