Spring Boot实现一个监听用户请求的拦截器

 

项目中需要监听用户具体的请求操作,便通过一个拦截器来监听,并继续相应的日志记录 
项目构建与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://www.itdadao.com/articles/c15a591762p0.html

 

时间: 2024-09-14 22:30:45

Spring Boot实现一个监听用户请求的拦截器的相关文章

Spring Boot 自动加载指定包下的拦截器

Spring Boot 在我们需要对程序添加拦截器需要使用 WebMvcConfigurerAdapter 中的 addInterceptors方法去注册拦截器,这样我们如果在程序里面有多个拦截或者我们在项目结构为maven 关系存在父子级关系时候.WebMvcConfigurerAdapter 类我们写在父类 这样就无法获取到子类存在哪些拦截器了.这个我们就需要在父级和子级都写对应的 WebMvcConfigurerAdapter 方法.这里我根据前面我的一篇博客为 获取某个包下面的所有类来实

在网站上上添加一个监听线程

问题描述 用SSH2了一个设备维修申请的网站,想实现这样.当管理员登陆这个网站的时候,在action里面会启动一个监听线程,扫描数据库,检测到当出现新的维修申请单的时候,会做相应操作的通知,例如弹出窗口. 而要保证管理员在网站上可以进行其他操作,然后后台依然有一个监听线程. 应该就是多线程,尝试了很久实现不到,希望哪位来指点一下,分用完了.望见谅. 或者大家可以提供点其他想法,前提就是保证管理员正常使用网站,而后台能跑着一个监听用户新的维修申请单的进程. 问题补充:我是想这样实现的,当客户提交一

跨浏览器监听用户输入

 在前端的开发中,我们经常面临着这样的需求,需要统计在input[type=text]或者textarea中用户输入的字数,以便给用户一些输入限制的提示,那么我们如何实现跨浏览器的监听用户在文本框的输入呢? 比如我们有如下的html结构,需要将用户在#textbox中输入的字数显示在#counter中: <textarea id="textbox"></textarea><div id="counter">0</div>

控制台输出-在Eclipse控制台中监听用户的键盘事件

问题描述 在Eclipse控制台中监听用户的键盘事件 最近在用java编写模拟一个人力资源管理系统,是在控制台实现的.其中有某个功能需要用户输入日期.日期是年月日一起输入的,我想在用户输完年份之后,控制台自动为用户打印出一个短横杠帮助用户输入月份.但是前提是用户还没有按下回车.怎样在用户键盘输入的过程中监听到用户目前已经输入几个字符?有没有大神给点建议. 解决方案 http://www.codeweblog.com/%E5%9C%A8javascript%E4%B8%AD%E7%9B%91%E5

【spring源码学习】spring的事件发布监听机制源码解析

[一]相关源代码类 (1)spring的事件发布监听机制的核心管理类:org.springframework.context.event.SimpleApplicationEventMulticaster. =>该类的初始化是放在项目加载时,在ioc容器xml配置文件解析加载完毕后,注册bean创建前后置处理实现类(BeanPostProcessor 接口实现),beanFactory配置处理(BeanFactoryPostProcessor接口实现)后,初始化该事件发布监听机制的核心类. pu

C# 一个监听 同时判断多个客户端发来的信息,有时候没有监听到!

问题描述 //监听是否有挂起if(tcplistener.Pending()){TcpClienttcp=tcplistener.AcceptTcpClient();stream=tcp.GetStream();try{IFormatterformatter=newBinaryFormatter();car=(CarDataInfo)formatter.Deserialize(stream);this.Invoke((EventHandler)(delegate{stringCnumber=ca

Python利用pyHook实现监听用户鼠标与键盘事件_python

本文以一段简单的监听鼠标.键盘事件的程序,实现获取用户的输入(比如登录某些网站的账号.密码)的功能.经测试,对于一台"裸奔"的电脑,完全能获取到用户输入的任何信息:但是如果安装了杀毒软件,就够呛了.具体实现方法如下: 一.代码部分:获取用户输入信息,并与截图一起保存到XX目录下 # -*- coding: utf-8 -*- # import pythoncom import pyHook import time import socket from PIL import ImageG

这么一个监听过程请问如何实现?

问题描述 和硬件有交互,类似指纹考勤系统,有指纹的时候需要显示人员信息,需要调用a()方法,判断返回值来进行显示和处理请问该怎么实现这种监听事件的方法?这个a()需要时刻监听之前没处理过类似,请各位朋友各个思路或者类似代码参考 解决方案 解决方案二:这个看你的硬件提供商吧,如果无事件主动通知的话,只能开线程轮询while(true){//读取dll看有没有指纹扫描Thread.Sleep(100);}解决方案三:指纹机有回调函数.只要有人扫描了之后会执行一个方法比如xxoo(intid)那么你可

windows服务如何监听post请求

问题描述 我建立一个windows服务,如何在用户提交一个页面的post请求时监听到并提取出提交的表单?高手请指点!谢谢! 解决方案 解决方案二:想做木马呀?POST基本上是HTTP包装内的日常动作,因此,可能需要嗅探技术来检测网络活动,再分析出是POST动作.....拦截POST的参数内容可能需要拦截网络活动的消息...以上蛮复杂的,也关注下面有没有简单的办法~