SpringMVC拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似与servlet中的Filter。

SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor来实现的。

在SpringMVC中定义一个Interceptor非常简单,主要有4种方式:

1)实现Spring的HandlerInterceptor接口;

2)继承实现了HandlerInterceptor接口的类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter;

3)实现Spring的WebRequestInterceptor接口;

4)继承实现了WebRequestInterceptor的类;

实现了拦截器之后,我们可以通过重写WebMvcConfigurerAdapter的addInterceptors方法来注册自己的拦截器。

我们这里只通过实现HandlerInterceptor接口的方式给出实例。实例中使用拦截器实现两个功能

1)计算每一次请求的处理时间

2)并对特定时间和特定用户(数据在codis中)的请求进行拒绝

 1、HandlerInterceptor接口

public interface HandlerInterceptor {boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
}

  • preHandle():预处理回调方法,若方法返回值为true,请求继续(调用下一个拦截器或处理器方法);若方法返回值为false,请求处理流程中断,不会继续调用其他的拦截器或处理器方法,此时需要通过response产生响应;
  • postHandle():后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时可以通过modelAndView对模型数据进行处理或对视图进行处理
  • afterCompletion():整个请求处理完毕回调方法,即在视图渲染完毕时调用

HandlerInterceptor有三个方法需要实现,但大部分时候可能只需要实现其中的一个方法,HandlerInterceptorAdapter是一个实现了HandlerInterceptor的抽象类,它的三个实现方法都为空实现(或者返回true),继承该抽象类后可以仅仅实现其中的一个方法。

2、实现拦截器

package com.xiaoju.dqa.sentinel.monitor.interceptor;import com.xiaoju.dqa.sentinel.common.client.redis.CodisClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Calendar;
import java.util.Set;public class AuthInterceptor implements HandlerInterceptor {protected final Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate CodisClient codisClient;/**   视图函数执行成功后执行* */@Overridepublic void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {}/**   在视图函数之后执行*   本函数的作用:计算处理时间* */@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception {long startTime = (Long) request.getAttribute("startTime");request.removeAttribute("startTime");logger.info("处理时间: {}", System.currentTimeMillis() - startTime);}/**   在视图函数之前执行*   返回true, 继续执行视图函数*   返回false, 终止请求流程*   本函数的作用,:拒绝特定时间sentinel:forbidden:hours; 特定用户的sentinel:forbidden:users请求, 并记录startTime* */@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {boolean going = true;long startTime = System.currentTimeMillis();request.setAttribute("startTime", startTime);Calendar ca = Calendar.getInstance();String  currentHour = String.valueOf(ca.get(Calendar.HOUR_OF_DAY));try {boolean isForbidHour = codisClient.sismember("sentinel:forbidden:hours", currentHour);if (isForbidHour) {Set<String> forbiddenUsers = codisClient.smembers("sentinel:forbidden:users");if (forbiddenUsers != null) {for (Cookie cookie : request.getCookies()) {if("username".equals(cookie.getName()) && forbiddenUsers.contains(cookie.getValue())) {logger.info("[拦截器] 禁止访问. 时间:{}, 用户:{}", currentHour, cookie.getValue());going = false;}}}}} catch (Exception e) {logger.info("[拦截器] 有问题", e);}return going;}
}

  

  

3、注册拦截器

这里预先生成了@bean - authInterceptor是为了让AuthInterceptor类中的codisClient的注入成功,否则即使自动注入了codisClient也无法注入成功。

package com.xiaoju.dqa.sentinel.configuration;import com.xiaoju.dqa.sentinel.monitor.interceptor.AuthInterceptor;
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 WebInterceptorConfig extends WebMvcConfigurerAdapter {@Beanpublic AuthInterceptor authInterceptor() {return new AuthInterceptor();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 多个拦截器组成一个拦截器链// addPathPatterns 用于添加拦截规则// excludePathPatterns 用户排除拦截registry.addInterceptor(authInterceptor()).addPathPatterns("/**").excludePathPatterns("/sentinel/monitor/**");super.addInterceptors(registry);}}

  

转载于:https://www.cnblogs.com/kangoroo/p/7652484.html

SpringMVC拦截器Interceptor相关推荐

  1. JAVA incept_java 过滤器(Filter)与springMVC 拦截器(interceptor)的实现案例

    java 过滤器Filter: package com.sun.test.aircraft.filter; import javax.servlet.*; import java.io.IOExcep ...

  2. SpringMVC拦截器-interceptor和filter区别

    关于interceptor和filter的区别,如图所示:

  3. Springmvc中的拦截器interceptor及与过滤器filter的区别

    一.Springmvc中的拦截器概述及与过滤器filter的区别 1).Springmvc中的拦截器interceptor用于对控制器controller进行预处理和后处理的技术; 2).可以定义拦截 ...

  4. SpringMVC→拦截器、SpringMVC拦截器实现、多个拦截器工作原理、拦截器使用场景、拦截器Interceptor与过滤器Filter区别

    拦截器 拦截器实现 多个拦截器工作原理 拦截器使用场景 请求编码设置及请求登录Session校验 使用时间段设置 拦截器Interceptor与过滤器Filter区别

  5. springMVC 拦截器

    为什么80%的码农都做不了架构师?>>>    实现springMVC 拦截器步骤: 1.定义拦截器类××××HandlerInterceptor  继承HandlerInterce ...

  6. springmvc 拦截器、国际化、验证

    2019独角兽企业重金招聘Python工程师标准>>> springmvc 拦截器 继承了HandlerIntercepter的类可以作为拦截器类: package com.yawn ...

  7. Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...

  8. SpringMVC拦截器2(资源和权限管理)(作为补充说明)

    SpringMVC拦截器(资源和权限管理) 1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServle ...

  9. SpringMVC拦截器HandlerInterceptor原理及使用

    在使用SpringMVC拦截器的时候,我们接触的最多的便是HandlerInterceptor接口,因为我们所有的自定义拦截器都必须要实现HandlerInterceptor接口,那么就先从Handl ...

最新文章

  1. 2021-2027年中国一体化预制泵站行业研究及前瞻分析报告
  2. 后台ajax调用中字符串到jquery中的json对象和数组对象转换问题
  3. SQL 隐藏手机号中间四位
  4. soap协议_Go和SOAP
  5. bzoj 1997: [Hnoi2010]Planar
  6. Cubieboard:享誉国外 Linux 圈子的中国产品
  7. 安全密码存储–请勿做的事和Java示例
  8. poj3422 Kaka's Matrix Travels(最小费用最大流问题)
  9. 转换文档参数_1分钟教会你将Excel转换成Word,简单高效,办公人士必备神技
  10. SAP License:SAP中的权限与破解
  11. 负债人有尊严吗?我觉得真的没有
  12. 计算机基础(二):嵌入式驱动、图像处理知识设备小结
  13. r语言 rgl 强制过程中_R语言中的方差分析方法汇总
  14. 开通支付宝口碑收款码提现免手续费,信用卡转账秒到支付宝
  15. 剑指offer 二叉搜索树与双向链表
  16. Spring学习笔记-C7-SpringMVC高级技术
  17. ABAQUS均匀受力,边界条件对称,但结果云图不对称
  18. Android Room之数据库加密
  19. Windows系统精华
  20. 硬件设计——有源/无源滤波

热门文章

  1. debian6 kvm安装虚拟机
  2. 使用print写文件
  3. Aptana 开发环境执行时默认的工作路径
  4. 《流畅的python》之 设计模式, 装饰器
  5. 7-13 日K蜡烛图
  6. ios 隔空投安装ipa_iOS 安装自己服务器上的IPA包
  7. android 启动白屏_从细节入手改善用户体验,Flutter跨平台App开发中设置Android和iOS的启动页
  8. cmake安装更新(解决cmake报错:CMake 3.8 or higher is required. You are running version 3.5.1
  9. Fiddler-004-配置过滤器之-域名过滤
  10. Filecoin将启动第一轮全球社区开发者二次方投票资助计划和线上Hackathon