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. Struts2工作原理及流程

    Struts2是基于MVC设计模式的JavaWeb 框架技术. 基于Struts2开发Java Web项目的主要步骤如下: (1)在web.xml中配置FilterDispatcher. (2)设计和 ...

  2. php截取中文字符串 GB2312 utf-8

    UTF-8截取中文字符串 function Cn_Substr($string, $length) { preg_match_all("/[\x01-\x7f]|[\xc2-\xdf][\x ...

  3. python爬虫常见面试题(二)

    前言 之所以在这里写下python爬虫常见面试题及解答,一是用作笔记,方便日后回忆:二是给自己一个和大家交流的机会,互相学习.进步,希望不正之处大家能给予指正:三是我也是互联网寒潮下岗的那批人之一,为 ...

  4. 玩转X-CTR100 l STM32F4 l HC-SR04超声波测距

    我造轮子,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 超声波测距模块HC-SR04可以测量2cm~40 ...

  5. DevExpress v18.1新版亮点——Windows 10 UWP篇

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

  6. CUDA ---- Memory Access

    Memory Access Patterns 大部分device一开始从global Memory获取数据,而且,大部分GPU应用表现会被带宽限制.因此最大化应用对global Memory带宽的使用 ...

  7. webStrom 美化

    webStrom 激活: 注册时,在打开的License Activation窗口中选择“License server”,在输入框输入下面的网址: http://idea.iteblog.com/ke ...

  8. Jenkins自动化部署代码

    通过jenkins自动化部署项目代码可以大幅度节省打包上传部署的时间,提高开发测试的工作效率 ========== 完美的分割线 =========== 1.Jenkins是什么 1)Jenkins是 ...

  9. springboot项目文件上传(绝对路径)并使用tomcat虚拟路径进行图片预览

    前言 项目中,需要上传文件,但是可能会比较多,所以不能放入项目目录中,需要指定目录并按顺序放置.并且:还需要这些数据可以预览(图片等). 那么问题就是:上传完成之后我存入服务器,并拿到绝对路径,存入数 ...

  10. k8s dockerk个人学习(1)

    虚拟机部署k8s 1. 创建虚拟机 虚拟机用的是virtualBox和vagrant工具,百度安装virtualBox和vagrant 创建vagrant目录并创建文件Vagrantfile内容为 V ...