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. 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.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. 转:Spring Boot中使用AOP统一处理Web请求日志

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

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

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

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

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

随机推荐

  1. DevExpress v18.1新版亮点——WPF篇(二)

    用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WPF v18.1 的新功能,快来下载试用新版本!点击下载& ...

  2. anu - proptypes

    //为了兼容yo var check = function () { return check; }; check.isRequired = check; export var PropTypes = ...

  3. Centos中查看系统信息的常用命令

    系统日志文件(可以通过cat或tail命令来查看) /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全 ...

  4. python opencv —— 背景提取(MOG、KNN)、识别与检测(Haar Cascade)

    注意 opencv 的坐标轴,x 轴向右,和 width 对应,y 轴向下,和 height 对应: 1. MOG2 与 KNN MOG:Mixture of Gaussian import cv2 ...

  5. qt5 交叉编译

    qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf 添加 QMAKE_LFLAGS += -Wl,-rpath-link,$$[QT_SYSROOT]/us ...

  6. 4天赚4000RMB 引流秘籍 卑鄙无耻之徒

    他说:有什么引流秘籍吗? 我说:贴吧.天涯.论坛都不错,只要不明着发广告,每天被动加几十个人轻轻松松的,如果执行力好,几百上千都有可能. 他说:我该怎么操作. 我说:网上找点好的帖子,简单修改一下部分 ...

  7. DS18B20配置

    复位脉冲: 先拉低至少480us,以产生复位脉冲,接着释放4.7k电阻为高,延时15~60us, 进入接收. void DS18B20_Rst(void) { DS18B20_IO_OUT(); // ...

  8. C#中IDisposable的用法

    在Net中,由GC垃圾回收线程掌握对象资源的释放,程序员无法掌控析构函数的调用时机.对于一些非托管资源,比如数据库链接对象等,需要实现IDisposable接口进行手动的垃圾回收.那么什么时候使用Id ...

  9. NSObject之一

    Objective-C中有两个NSObject,一个是NSObject类,另一个是NSObject协议.而其中NSObject类采用了NSObject协议.在本文中,我们主要整理一下NSObject类 ...

  10. ITelephony.aidl

    在src下先建立包名为com.android.internal.telephony(右键src > new > package,create package-info.java打钩),然后 ...