博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Boot实现一个监听用户请求的拦截器
阅读量:6612 次
发布时间:2019-06-24

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

 

项目中需要监听用户具体的请求操作,便通过一个拦截器来监听,并继续相应的日志记录 

项目构建与Spring Boot,Spring Boot实现一个拦截器很容易。

Spring Boot的核心启动类继承WebMvcConfigurerAdapter

// 增加拦截器    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(new RequestLog());    }   //这个RequestLog就是我们定义的拦截器

拦截器的编写

public class RequestLog extends HandlerInterceptorAdapter {    /**     * 前置检查     */    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)            throws Exception {        String ip = request.getRemoteAddr();        long startTime = System.currentTimeMillis();        request.setAttribute("requestStartTime", startTime);        HandlerMethod handlerMethod = (HandlerMethod) handler;        // 获取用户token        Method method = handlerMethod.getMethod();        System.out.println("用户:"+ip+",访问目标:"+method.getDeclaringClass().getName() + "." + method.getName());        return true;    }    // controller处理完成    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,            ModelAndView modelAndView) throws Exception {        HandlerMethod handlerMethod = (HandlerMethod) handler;        Method method = handlerMethod.getMethod();        long startTime = (Long) request.getAttribute("requestStartTime");        long endTime = System.currentTimeMillis();        long executeTime = endTime - startTime;        // log it        if (executeTime > 1000) {            System.out.println("[" + method.getDeclaringClass().getName() + "." + method.getName() + "] 执行耗时 : "                    + executeTime + "ms");        } else {            System.out.println("[" + method.getDeclaringClass().getSimpleName() + "." + method.getName() + "] 执行耗时 : "                    + executeTime + "ms");        }    }}

我们自己实现的拦截器需要继承HandlerInterceptorAdapter,并重写如下三个方法:

在preHandle中,可以进行编码、安全控制等处理; 在postHandle中,有机会修改ModelAndView;

还存在一个也比较重要的方法在afterCompletion中,下面介绍一些这三个方法的执行流程:

发起请求,进入拦截器链,运行所有拦截器的preHandle方法. 

当preHandle方法返回false时,(后面的拦截器就不再执行了)从当前拦截器往回执行所有拦截器的afterCompletion方法(不是postHandle方法哦),再退出拦截器链。 
当preHandle方法全为true时,执行下一个拦截器,直到所有拦截器执行完。再运行被拦截的Controller。然后进入拦截器链,运行所有拦截器的postHandle方法,完后从最后一个拦截器往回执行所有拦截器的afterCompletion方法. 
当有拦截器抛出异常时,会从当前拦截器往回执行所有拦截器的afterCompletion方法

preHandle方法:
返回true,映射处理器执行链将继续执行;
当返回false时,DispatcherServlet处理器认为拦截器已经处理完了请求(这个请求已经被拦截了:http请求的status是200,但response什么也没有),而不继续执行执行链中的其它拦截器和处理器。

 

http://www.itdadao.com/articles/c15a591762p0.html

 

转载地址:http://wuaso.baihongyu.com/

你可能感兴趣的文章
vmware workstation14永久激活密钥分享
查看>>
iOS 多线程 之 GCD(大中枢派发)(一)
查看>>
Myeclipse中打开接口实现类的快捷键
查看>>
删除sql dump中的AUTO_INCREMENT
查看>>
使用JdbcTemplate和JdbcDaoSupport
查看>>
C博客作业--指针
查看>>
版本12.2.0.1.0数据库,复制种子数据库快速创建租户数据库PDB
查看>>
Glibc 和 uClibc
查看>>
vs2012中自带IIS如何让其他电脑访问
查看>>
Redux:异步操作
查看>>
Mysql学习第三课-分析二进制日志进行增量备份和还原
查看>>
如何在 Android 手机上安装 Ubuntu 13.04
查看>>
HDU 6073 - Matching In Multiplication | 2017 Multi-University Training Contest 4
查看>>
C语言 scanf()和gets()函数的区别
查看>>
如何检测域名是否被微信屏蔽 微信域名检测接口API是如何实现
查看>>
POJ1611-The Suspects
查看>>
Linux下安装Python-3.3.2【转】
查看>>
LeetCode OJ:Merge Two Sorted Lists(合并两个链表)
查看>>
功能测试
查看>>
【BZOJ 1901】Dynamic Rankings
查看>>