拦截请求并记录相应信息-springboot

方式:

1、FIlter过滤器

2、interceptor拦截器

3、Aspect切片

一、Filter过滤器形式

  只能处理request中的数据  不能确定请求要走的是哪个controller信息

1、过滤器实现第一种方式

package com.nxz.filter;import org.springframework.stereotype.Component;import javax.servlet.*;
import java.io.IOException;
import java.util.Date;// Filter 是javax.servlet下的
@Component //让自定义filter起作用,只需要让springcontext管理起来即可
public class TimeFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("time filter init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("time filter start");long time = new Date().getTime();filterChain.doFilter(servletRequest, servletResponse);System.out.println("消耗时间:" + (new Date().getTime() - time));System.out.println("time filter start");}@Overridepublic void destroy() {System.out.println("time filter destroy");}
}

当项目启动的时候会在控制台输出:time filter init

当访问localhost:8080/user/1时:进入拦截器

结束结束后:

time filter start
进入getinfo服务
消耗时间:367
time filter end

2、filter过滤器第二种方式

package com.nxz.filter;import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class WebConfig {@Beanpublic FilterRegistrationBean timeFilter(){FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();TimeFilter timeFilter = new TimeFilter();filterRegistrationBean.setFilter(timeFilter);//指定什么样的请求回走timefilter过滤器filterRegistrationBean.addUrlPatterns("/*");return filterRegistrationBean;}
}

二、inteceptor拦截器

  只能处理到类中的方法,但是不能记录方法的参数是什么

package com.nxz.inteceptor;import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;@Component
public class TimeInteceptor implements HandlerInterceptor {//在controller调用之前调用@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println("preHandler");System.out.println(((HandlerMethod) o).getBean().getClass().getName());//输出类名System.out.println(((HandlerMethod) o).getMethod().getName());//输出方法名//为了在prehandler方法和posthandler方法之间传递信息,可以将数据放到request中httpServletRequest.setAttribute("startTime", new Date().getTime());return false;}//在controller调用之后调用,如果controller中抛出异常,这个方法不会调用@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");Long start = (Long) httpServletRequest.getAttribute("startTime");System.out.println("time interceptor 耗时:" + (new Date().getTime() - start));}//无论controller是否抛出异常,都会调用@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion");Long start = (Long) httpServletRequest.getAttribute("startTime");System.out.println("time interceptor 耗时:" + (new Date().getTime() - start));System.out.println("ex is :" + e);}
}

interceptor实现拦截功能还需要配置webconfig

package com.nxz.config;import com.nxz.filter.TimeFilter;
import com.nxz.inteceptor.TimeInteceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {@Autowiredprivate TimeInteceptor timeInteceptor;//自定义的interceptor 要起作用的话 需要继承webmvcConfigurerAdater ,重写addInterceptors@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(timeInteceptor);}
}

访问localhost:8080/user/1后,输入日志:

preHandler
com.nxz.controller.UserController
getInfo
进入getinfo服务
postHandle
time interceptor 耗时:48
afterCompletion
time interceptor 耗时:48
ex is :null

三、切片Aspect(AOP)  -- 切入点(注解)、增强(方法)

  需要导入aop依赖

package com.nxz.aspect;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;import java.util.Date;@Aspect
@Component
public class TimeAspect {//@Before @After @AfterThrowing @Around 基本的aop注解@Around("execution(* com.nxz.controller.UserController.*(..))")public Object handlerControllerMehtod(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("time aspect start");Object[] args = joinPoint.getArgs();for (Object arg : args) {System.out.println(arg);}Long time = new Date().getTime();Object obj = joinPoint.proceed();System.out.println("time aspect end,耗时:" + (new Date().getTime() - time));return obj;}}

访问地址后:

time aspect start
1   --》请求参数
进入getinfo服务
time aspect end,耗时:4

几种方式起作用的顺序:

====

Usercontroller:

    @GetMapping("/{id:\\d+}")@JsonView(User.UserDetailView.class)public User getInfo(@PathVariable String id) {System.out.println("进入getinfo服务");User user = new User();user.setUsername("tom");return user;}

posted @ 2019-04-28 22:44 巡山小妖N 阅读(...) 评论(...) 编辑 收藏

拦截请求并记录相应信息-springboot相关推荐

  1. springboot拦截请求路径_SpringBoot中的拦截机制

    SpringBoot的拦截机制实现不是其特有的,它和Spring中一致,都可以使用下面三种技术来实现拦截机制过滤器(Filter) 拦截器(Interceptor) 切片(Aspect) 过滤器拦截 ...

  2. 微信客服机器人(踩坑记录、SpringBoot、企业微信)

    微信客服机器人(踩坑记录.SpringBoot.企业微信) 转载请注明出处:https://www.jjput.com/archives/wei-xin-ke-fu-ji-qi-ren 总体流程 当有 ...

  3. 从0到1实现一个Android路由(6)——拦截请求再跳转

    从0到1实现一个Android路由系列文章 从0到1实现一个Android路由(1)--初探路由 从0到1实现一个Android路由(2)--URL解析器 从0到1实现一个Android路由(3)-- ...

  4. ajax被token拦截,vue中封装ajax请求,并且拦截请求在请求头中添加token

    /** * 封装请求方法 * @param {Object} url 接口请求地址 * @param {Object} data 接口请求参数(无需请求方式参数,则此项可以为空,否则必须传) * @p ...

  5. web developer tips (38):如何用请求失败记录追踪重写规则

    原文地址:How to use Failed Request Tracing to trace Rewrite Rules. IIS 7.0 请求失败跟踪(Failed Request Tracing ...

  6. node 拦截器拦截请求下载电子书以及等待前端渲染操作、浏览器操作

    1.因为下载资源是通过点击事件来ajax请求的,无法在页面看到a标签链接2.通过拦截器来拦截3.等待前端渲染完成后(类挂载后)获取数据await page.waitForSelector('选择器') ...

  7. android webview 拦截响应,android WebView拦截请求详解

    1.WebView基本用法 WebView的基本用法相信大多数android开发者都是会使用的,最简单的就是调用个loadUrl方法,但是记得要在清单文件中添加网络权限.我也简单了写了一个加载百度的 ...

  8. fiddler拦截请求、篡改响应内容、模拟弱网

    用途:用于一些安全性方面的校验,例如修改密码中间有一个步骤需要校验手机验证码,如果拦截接口返回的数据将失败修改为成功,在发送给浏览器,就能绕过验证码直接输入新密码 1.拦截请求 在浏览器发起请求直接在 ...

  9. KgCaptcha 语序识别验证码请求日志记录

    前言 请求日志记录是一个非常普遍的功能,几乎可以涉及到所有的项目.所以一个方便使用的日志记录,将会方便日后的管理,于是我通过使用 KgCaptcha 在我的验证码项目中实现. 基本显示 表格记录的字段 ...

最新文章

  1. An example of EXPORT / IMPORT usage - in office integration and odata metadata model cache
  2. 八杯水微博程序演示及下载
  3. 小辣椒p60手机怎么样_奇葩对决!3600元的格力手机与3599元的小辣椒V19,谁更强?...
  4. java8方法引用符合_Java8 方法引用和构造方法引用
  5. 弱水三千 之 统计独立性、统计相关性辨析
  6. Pandas速查手册中文版
  7. 省级c语言笔试题,C语言笔试题库.doc
  8. 电视hdr测试软件,HDR+4K一个都不能少 本地资源播放测试
  9. 【信号处理】基于高阶统计量特征的通信系统中微弱信号检测附matlab代码
  10. 富龙飞联手文创产业研究所,推出国内首个AR+文创建设应用系统
  11. LabVIEW编程LabVIEW开发在LabVIEW中复用现有代码
  12. 2019 中文互联网资源碎碎念
  13. 逆概率加权法(Inverse Probability Weighting, IPW)的原理及R实现
  14. 表情识别------CNN训练fer2013数据集
  15. 项目进度管理-活动排序工具与技术(前导图、箭线图)
  16. mysql安装时损坏的图像_损坏的图像,详细教您提示损坏的图像该怎么解决
  17. 单片机通信——spi、iic、uart
  18. vue spa php,使用Laravel 和 Vue 构建一个简单的SPA
  19. 台积电开始试产3nm ,苹果、Intel公司也有意向在跟进3nm技术
  20. 计算机学报韶关学院,期刊影响因子_自然科学_专业资料.doc

热门文章

  1. PHP实现图片马赛克效果
  2. 不要自称是程序员,我十多年的 IT 职场总结
  3. 4个变量取最大值 c++_DNF:安徒恩上线服务器爆满,甲板上全是火山C,通关翻出4个金牌...
  4. php怎么输出mysql一条数据,MySQL数据输出在一个可打印的PHP变量
  5. java 制作 winrar,Java使用winrar解压缩
  6. android apk反编译工具下载,Android apk反编译工具下载与使用
  7. 怎么把excel文件转成dta_Word怎么转成PDF文件?首选就是这个转换方法!
  8. 【java】Charset 字符集
  9. python mount回调函数_让Python脚本暂停执行的几种方法(小结)
  10. 上顿号符号_标点符号常见错误,读后涨知识了