spring boot 项目重新搭建----------mvc配置:拦截器
6.addInterceptors添加拦截器
registry.addInterceptor(BeanKit.getOfType(DebugInterceptor.class));
实现debug拦截器
@Slf4j
@Aspect
@Component
public class DebugInterceptor extends HandlerInterceptorAdapter {private ThreadLocal<Long> startTime = ThreadLocal.withInitial(System::nanoTime);private ThreadLocal<Signature> signature = ThreadLocal.withInitial(() -> null);private ThreadLocal<Object[]> paramsCache = ThreadLocal.withInitial(() -> null);private ThreadLocal<Object> resultCache = ThreadLocal.withInitial(() -> null);@Pointcut("execution(public * zool.firefly.controller.*.*(..))")public void resultAop() {}@Around("resultAop()")@SneakyThrowspublic Object resultAround(ProceedingJoinPoint pjp) {val result = pjp.proceed();resultCache.set(result);return result;}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {startTime.set(System.nanoTime());paramsCache.set(new Object[]{request.getParameterMap()});return true;}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {StringBuilder str = new StringBuilder();str.append("\n===================== DebugInterceptor =====================");str.append("\nRemote IP : ").append(WebKit.getClientIP());str.append("\nRequest Method : ").append(request.getMethod());str.append("\nRequest URL : ").append(request.getRequestURI()).append(StringUtils.isEmpty(request.getQueryString()) ? "" : "?" + request.getQueryString());str.append("\nAction Signature : ").append(Optional.ofNullable(signature.get()).map(Object::toString).orElse("Empty"));str.append("\nRequest Params : ");Object[] param = paramsCache.get();if (param != null && param.length == 1 && param[0] instanceof Map) {str.append(JSON.toJSONString(param[0]));} else {Object[] params = Optional.ofNullable(paramsCache.get()).orElse(new Object[]{});for (int i = 0; i < params.length; i++) {Object obj = params[i];// 需要保证类直接继承Object 并且没有实现任何接口 才能用JSON序列化boolean isPlanObject = Optional.ofNullable(obj).map(o -> o.getClass().getSuperclass().equals(Object.class)&& !o.getClass().isArray()&& o.getClass().getInterfaces().length == 0).orElse(true);str.append(i == 0 ? "[" : "\n [").append(i).append("] => ").append(isPlanObject ? JSON.toJSONString(obj) : String.valueOf(obj));}}str.append("\nResponse Status : ").append(response.getStatus());//TODO 添加返回结果str.append("\nHandle Time : ").append(TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime.get())).append("ms");str.append("\n============================================================");log.info(str.toString());signature.remove();paramsCache.remove();resultCache.remove();}
}
访问时的效果:
自定义拦截器继承HandlerInterceptorAdapter实现
preHandle,postHandle,afterCompletion前置拦截,后置拦截,最终拦截
spring boot 项目重新搭建----------mvc配置:拦截器相关推荐
- 如何把Spring Boot 项目变成一个XML配置的Spring项目
现在大家都追赶新的技术潮流,我来逆行一下. 其实Spring Boot 隐藏了大量的细节,有大量的默认配置,其实通过xml配置的方式也可以达到和Spring Boot一样的效果. Profile 在S ...
- springboot 控制台输出错误信息_高级码农Spring Boot实战进阶之过滤器、拦截器的使用...
众所周知的Spring Boot是很优秀的框架,它的出现简化了新Spring应用的初始搭建以及开发过程,大大减少了代码量,目前已被大多数企业认可和使用.这个专栏将对Spring Boot框架从浅入深, ...
- Spring Boot项目快速搭建
实验要求及目的: (1)掌握ApplicationContext容器使用属性setter方法注入的实现: (2)了解Spring的概念和优点: (3)熟悉Spring中的IOC和DI: 实验环境: ...
- 【Spring Boot】 过滤器、监听器、拦截器的使用
概念和使用场景 监听器 listener是servlet规范中定义的一种特殊类.用于监听servletContext.HttpSession和servletRequest等域对象的创建和销毁事件. 实 ...
- 【Spring Boot项目】个人在线音乐播放器
文章目录 1. 项目简介 2. 数据库表的设计 3. 拦截器及返回数据格式 4. 注册功能 5. 登陆功能 6. 音乐列表相关业务 6.1 查询功能 6.2 上传音乐 6.3 播放音乐 6.4 收藏音 ...
- 怎样把一个项目加入微服务器,构建微服务:快速搭建Spring Boot项目
Spring Boot简介: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...
- Myeclipse下使用Maven搭建spring boot项目(第二篇)
现在需要搭建spring boot框架,并实现一个HelloWorld的项目,让程序真正运行起来. 一.在pom.xml中引入spring-boot-start-parent,spring官方的叫st ...
- springboot controller访问不到_构建微服务:快速搭建Spring Boot项目
Spring Boot简介: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...
- spring boot项目自定义数据源,mybatisplus分页、逻辑删除无效解决方法
Spring Boot项目中数据源的配置可以通过两种方式实现: 1.application.yml或者application.properties配置 2.注入DataSource及SqlSessio ...
最新文章
- 结对开发--求二维数组的最大子数组
- 如何使用BigDecimal?
- __doPostBack实现updatepanel的局部更新
- ubuntu 16.04 配置Python2.7 和 Python3.5 同时调用OpenCV
- iOS开发学无止境 - NSFileManager文件操作的十个小功能
- C++中,引用作为函数参数
- 23.3. 操作系统监控需求
- 需要凭据_PE管件连接时有哪些需要注意的地方
- bzoj 3394: [Usaco2009 Jan]Best Spot 最佳牧场(floyd)
- 7-8 统计工龄 (20 分)
- 如何更方便地将谷歌翻译导入到Goldendict
- php 怎么把数组按拼音,php实现数组按拼音顺序排序的方法
- 厦门理工学院计算机毕业要求,计算机教学中心-厦门理工学院教务处.PDF
- 多道程序 cpu利用率
- Java异或性能测试速度为2.5GiB/s
- tabbar 图片太大了怎么办_设置TabBar分栏控制器上图片的大小问题
- 响应式布局的个人博客
- lol祖安服务器维护,触目惊心 被演员与代练所“支配”的英雄联盟
- Joint Discriminative and Generative Learning for Person Re-identification 论文翻译
- 网络上游戏制作相关学习站点的网址!