阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

131次阅读
没有评论

共计 2164 个字符,预计需要花费 6 分钟才能阅读完成。

项目中需要监听用户具体的请求操作,便通过一个拦截器来监听,并继续相应的日志记录
项目构建与 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 方法,再退出拦截器链。
当 preHandle 方法全为 true 时,执行下一个拦截器, 直到所有拦截器执行完。再运行被拦截的 Controller。然后进入拦截器链,运行所有拦截器的 postHandle 方法, 完后从最后一个拦截器往回执行所有拦截器的 afterCompletion 方法.
当有拦截器抛出异常时, 会从当前拦截器往回执行所有拦截器的 afterCompletion 方法

preHandle 方法:返回 true,映射处理器执行链将继续执行;当返回 false 时,DispatcherServlet 处理器认为拦截器已经处理完了请求,而不继续执行执行链中的其它拦截器和处理器。

Spring Boot 入门学习笔记 http://www.linuxidc.com/Linux/2016-10/135889.htm

Spring Boot+Nginx+Tomcat+SSL 配置笔记  http://www.linuxidc.com/Linux/2016-01/127134.htm

Spring Boot 的详细介绍 :请点这里
Spring Boot 的下载地址 :请点这里

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-10/136358.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-21发表,共计2164字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中