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. 数据集永久字段的Visble 属性为何不起作用

    ADOTable,永久字段,已经将visible属性设置为false,设计期,打开数据集,该字段是隐藏了,但是运行时还是显示的!! 原因是,之前持久化了 DBGRID的Coumns,FORM创建又读取 ...

  2. 离线使用Visual Studio的Javascript Prettier插件

    用Prettier插件来格式化Javascript代码效果好的不得了,简直是强迫症的救命克星,可惜单位的电脑是不联网的,始终用不了,今天抽空研究了一下,找到办法了. 1.下载JavaScript Pr ...

  3. torch7 安装 并安装 hdf5模块 torch模块 nn模块 (系统平台为 ubuntu18.04 版本)

    今年的CCF A会又要开始投稿了,实验室的师弟还在玩命的加实验,虽然我属于特殊情况是该从靠边站被老板扶正但是实验室的事情我也尽力的去帮助大家,所以师弟在做实验的时候遇到了问题也会来问问我,这次遇到的一 ...

  4. ubuntu下设置电脑为WiFi热点

    这是个问题 自从Windows奔溃以来! 扔掉360:Linux下无线网卡作WiFi路由器

  5. Codeforces 1096G. Lucky Tickets【生成函数】

    LINK 题目大意 很简单自己看 思路 考虑生成函数(为啥tags里面有一个dp啊) 显然,每一个指数上是否有系数是由数集中是否有这个数决定的 有的话就是1没有就是0 然后求出这个生成函数的\(\fr ...

  6. HDU 6188:Duizi and Shunzi(贪心)(广西邀请赛)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6188 题意 有n个数字,每个数字小于等于n,两个相同的数字价值为1,三个连续的数字价值为1 .问这n个 ...

  7. 【codeforces div3】【E. Cyclic Components】

    E. Cyclic Components time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  8. 【socket编程】什么是socket编程

    Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的网络 ...

  9. 使用flex布局,垂直居中

    要完成下面的样式: 1:绿色部分宽度固定,红色部分自适应宽度: 2:整体高度自适应,红色和绿色部分的内容垂直居中: html代码: <div class="main"> ...

  10. mac 终端显示彩色

    修改~/.bash_profile文件,在文件中加入下面两行配置.   export CLICOLOR=1  export LSCOLORS=gxfxaxdxcxegedabagacad  保存文件, ...