SpringMVC拦截器Interceptor
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相关推荐
- JAVA incept_java 过滤器(Filter)与springMVC 拦截器(interceptor)的实现案例
java 过滤器Filter: package com.sun.test.aircraft.filter; import javax.servlet.*; import java.io.IOExcep ...
- SpringMVC拦截器-interceptor和filter区别
关于interceptor和filter的区别,如图所示:
- Springmvc中的拦截器interceptor及与过滤器filter的区别
一.Springmvc中的拦截器概述及与过滤器filter的区别 1).Springmvc中的拦截器interceptor用于对控制器controller进行预处理和后处理的技术; 2).可以定义拦截 ...
- SpringMVC→拦截器、SpringMVC拦截器实现、多个拦截器工作原理、拦截器使用场景、拦截器Interceptor与过滤器Filter区别
拦截器 拦截器实现 多个拦截器工作原理 拦截器使用场景 请求编码设置及请求登录Session校验 使用时间段设置 拦截器Interceptor与过滤器Filter区别
- springMVC 拦截器
为什么80%的码农都做不了架构师?>>> 实现springMVC 拦截器步骤: 1.定义拦截器类××××HandlerInterceptor 继承HandlerInterce ...
- springmvc 拦截器、国际化、验证
2019独角兽企业重金招聘Python工程师标准>>> springmvc 拦截器 继承了HandlerIntercepter的类可以作为拦截器类: package com.yawn ...
- Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...
- SpringMVC拦截器2(资源和权限管理)(作为补充说明)
SpringMVC拦截器(资源和权限管理) 1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServle ...
- SpringMVC拦截器HandlerInterceptor原理及使用
在使用SpringMVC拦截器的时候,我们接触的最多的便是HandlerInterceptor接口,因为我们所有的自定义拦截器都必须要实现HandlerInterceptor接口,那么就先从Handl ...
最新文章
- 2021-2027年中国一体化预制泵站行业研究及前瞻分析报告
- 后台ajax调用中字符串到jquery中的json对象和数组对象转换问题
- SQL 隐藏手机号中间四位
- soap协议_Go和SOAP
- bzoj 1997: [Hnoi2010]Planar
- Cubieboard:享誉国外 Linux 圈子的中国产品
- 安全密码存储–请勿做的事和Java示例
- poj3422 Kaka's Matrix Travels(最小费用最大流问题)
- 转换文档参数_1分钟教会你将Excel转换成Word,简单高效,办公人士必备神技
- SAP License:SAP中的权限与破解
- 负债人有尊严吗?我觉得真的没有
- 计算机基础(二):嵌入式驱动、图像处理知识设备小结
- r语言 rgl 强制过程中_R语言中的方差分析方法汇总
- 开通支付宝口碑收款码提现免手续费,信用卡转账秒到支付宝
- 剑指offer 二叉搜索树与双向链表
- Spring学习笔记-C7-SpringMVC高级技术
- ABAQUS均匀受力,边界条件对称,但结果云图不对称
- Android Room之数据库加密
- Windows系统精华
- 硬件设计——有源/无源滤波
热门文章
- debian6 kvm安装虚拟机
- 使用print写文件
- Aptana 开发环境执行时默认的工作路径
- 《流畅的python》之 设计模式, 装饰器
- 7-13 日K蜡烛图
- ios 隔空投安装ipa_iOS 安装自己服务器上的IPA包
- android 启动白屏_从细节入手改善用户体验,Flutter跨平台App开发中设置Android和iOS的启动页
- cmake安装更新(解决cmake报错:CMake 3.8 or higher is required. You are running version 3.5.1
- Fiddler-004-配置过滤器之-域名过滤
- Filecoin将启动第一轮全球社区开发者二次方投票资助计划和线上Hackathon