博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringCloud拦截器使用(Interceptors拦截器使用)
阅读量:5743 次
发布时间:2019-06-18

本文共 5059 字,大约阅读时间需要 16 分钟。

hot3.png

    SpringCloud后端要对前端请求进行拦截,也就是日志记录,使用SpringAOP方式即面向切面方式进行拦截。

    首先,拦截请求地址(ip),使用HandlerInterceptorAdapter,它拦截的是请求地址,所以针对请求地址做一些验证、预处理操作比较合适,比如下面,我用它来统计请求访问这个地址的响应时间。

    RequestLog

import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.lang.reflect.Method;import java.time.Instant;/*    HandlerInterceptoer拦截的是请求地址,所以针对请求地址做一些验证、预处理等操作比较合适,    比如需要统计请求这个地址的响应时间*//*  Filter是Servlet规范规定的,不属于spring框架,也是用于请求的拦截。    但是它适合更粗粒度的拦截,在请求前后做一些编解码处理、日志记录等。*/public class RequestLog extends HandlerInterceptorAdapter {    private static final Logger LOGGER = LoggerFactory.getLogger(RequestLog.class);    /**     * 前置检查,方法执行前     */    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)            throws Exception {        String ip = request.getRemoteAddr();        Instant startTime = Instant.now();        request.setAttribute("logrequestStartTime", startTime);        HandlerMethod handlerMethod = (HandlerMethod) handler;        // 获取用户token        Method method = handlerMethod.getMethod();        LOGGER.info("用户:"+ip+",访问目标:"+method.getDeclaringClass().getName() + "." + method.getName());        return true;    }    /**     *  方法执行中     * @param request     * @param response     * @param handler     * @param modelAndView     * @throws Exception     */    // controller处理完成    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,                           ModelAndView modelAndView) throws Exception {        HandlerMethod handlerMethod = (HandlerMethod) handler;        Method method = handlerMethod.getMethod();        Instant startTime = (Instant) request.getAttribute("logrequestStartTime");        Instant endTime = Instant.now();        long executeTime = endTime.toEpochMilli()- startTime.toEpochMilli();        // log it        if (executeTime > 1000) {            LOGGER.info("[" + method.getDeclaringClass().getName() + "." + method.getName() + "] 执行耗时 : "                    + executeTime + "ms");        } else {            LOGGER.info("[" + method.getDeclaringClass().getSimpleName() + "." + method.getName() + "] 执行耗时 : "                    + executeTime + "ms");        }    }}

    然后,进行面向切面拦截,将请求日志记录下来

import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.context.annotation.Configuration;import org.springframework.web.context.request.RequestAttributes;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;/** * Created by pd on 17/12/07. *///描述切面类@Aspect     //@Aspect注解就是告诉spring 这是一个aop类,AOP切面@Configuration  //可理解为用spring的时候xml里面的
标签,类中 @Bean可以理解为用Spring的时候xml里面的
标签public class LogRecordAspect {private static final Logger logger = LoggerFactory.getLogger(LogRecordAspect.class); // 用@Pointcut来注解一个切入方法 //@Pointcut注解 声明这是一个需要拦截的切面,也就是说,当调用任何一个controller方法的时候,都会激活这个aop @Pointcut("execution(* com.pengda.controller.*Controller.*(..))") //两个..代表所有子目录,最后括号里的两个..代表所有参数 public void excudeService() { } //@Around注解 环绕执行,就是在调用之前和调用之后,都会执行一定的逻辑 @Around("excudeService()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { RequestAttributes ra = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes sra = (ServletRequestAttributes) ra; HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); String url = request.getRequestURL().toString(); String method = request.getMethod(); String uri = request.getRequestURI(); String queryString = request.getQueryString(); try{ Object[] args =pjp.getArgs(); for(int i=0;i
){ RequestInfo
r= (RequestInfo
) args[i]; logger.info("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri, r.toString()); }else{ logger.info("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri,args[i]); } } }catch (Exception e){ logger.info("请求开始, 各个参数, url: {}, method: {}, uri: {}, params: {}", url, method, uri,queryString); } // result的值就是被拦截方法的返回值 Object result = pjp.proceed(); //logger.info("请求结束,controller的返回值是 " + result.toString()); //logger.info("请求结束,controller的返回值是 " + result); return result; }}

 

转载于:https://my.oschina.net/bugkiller/blog/1810406

你可能感兴趣的文章
关于爱情只有一句忠告
查看>>
CentOS 7下安装部署Oracle11g图文教程
查看>>
F#初学笔记06
查看>>
实战:将企业域名解析委派给企业DNS服务器
查看>>
在Lync 2013环境部署Office Web Apps
查看>>
微软大会Ignite,你准备好了么?
查看>>
读书笔记-高标管事 低调管人
查看>>
Master带给世界的思考:是“失控”还是进化
查看>>
用户和开发者不满苹果iCloud问题多多
查看>>
java.lang.UnsatisfiedLinkError:no dll in java.library.path终极解决之道
查看>>
我的工具:文本转音频文件
查看>>
【许晓笛】从零开始运行EOS系统
查看>>
【跃迁之路】【460天】程序员高效学习方法论探索系列(实验阶段217-2018.05.11)...
查看>>
C++入门读物推荐
查看>>
TiDB 源码阅读系列文章(七)基于规则的优化
查看>>
面试中会遇到的正则题
查看>>
Spring之旅第八站:Spring MVC Spittr舞台的搭建、基本的控制器、请求的输入、表单验证、测试(重点)...
查看>>
数据结构与算法——常用排序算法及其Java实现
查看>>
你所不知的Webpack-多种配置方法
查看>>
React.js 集成 Kotlin Spring Boot 开发 Web 应用实例详解
查看>>