Java 中的过滤器Filter 和拦截器 Interceptor
时间:2020-05-20
本文章向大家介绍Java 中的过滤器Filter 和拦截器 Interceptor,主要包括Java 中的过滤器Filter 和拦截器 Interceptor使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.先说拦截器 Interceptor
本项目以springboot为例:
新建
InterceptorConfig
package com.opendev.mystudy.MyInterceptor; 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 InterceptorConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); super.addInterceptors(registry); } }
MyInterceptor
package com.opendev.mystudy.MyInterceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyInterceptor implements HandlerInterceptor{ /** * * preHandle是请求执行前执行的,postHandler是请求结束执行的, * 但只有preHandle方法返回true的时候才会执行,afterCompletion是视图渲染完成后才执行, * 同样需要preHandle返回true,该方法通常用于清理资源等工作。 * */ long start = System.currentTimeMillis(); @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("preHandle。。。"); start = System.currentTimeMillis(); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("postHandle。。。"); System.out.println("Interceptor cost="+(System.currentTimeMillis()-start)); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("afterCompletion。。。"); } }
执行的顺序如下
2.再说说 Filter ,先集成到配置类中
FiterConfig
package com.opendev.mystudy.MyFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class FilterConfig { @Bean public FilterRegistrationBean registFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new MyFilter()); registration.addUrlPatterns("/test/frist/*"); registration.setName("MyFilter"); registration.setOrder(1); return registration; } }
MyFilter
package com.opendev.mystudy.MyFilter; import javax.servlet.*; import javax.servlet.FilterConfig; import javax.servlet.annotation.WebFilter; import java.io.IOException; /** * 用这个@WebFilter就要在主类上配置@ServletComponentScan */ //@ServletComponentScan("com.opendev.mystudy.MyFilter") @WebFilter(urlPatterns = "/*", filterName = "MyFilter") public class MyFilter implements Filter { /** * * servlet 初始化过程 * @param filterConfig * @throws ServletException */ @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("进入了 init 方法"); } /** * * 这段代码的逻辑比较简单,就是在方法执行前先记录时间戳, * 然后通过过滤器链完成请求的执行,在返回结果之间计算执行的时间。 * 这里需要主要,这个类必须继承Filter类,这个是Servlet的规范, * 这个跟以前的Web项目没区别。但是,有了过滤器类以后, * 以前的web项目可以在web.xml中进行配置,但是spring boot项目并没有web.xml这个文件, * * @param servletRequest * @param servletResponse * @param filterChain * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("进入了 doFilter 方法"); long start = System.currentTimeMillis(); filterChain.doFilter(servletRequest,servletResponse); System.out.println("Execute cost="+(System.currentTimeMillis()-start)); } @Override public void destroy() { System.out.println("进入了 destroy 方法"); } }
二者的方法都是访问controller为
package com.opendev.mystudy.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/test") public class MyController { @RequestMapping(value = "/frist",method = RequestMethod.GET) public void TestController() throws InterruptedException { System.out.println("-----------------"); Thread.sleep(2000); } }
3.以上二者的分别使用,现在把他们二个集成使用看
从上面打印的日志就可以看,过滤器比拦截器先执行。
总结:过滤器比拦截器先执行
原文地址:https://www.cnblogs.com/cb1186512739/p/12924346.html
- 解决openssh漏洞,升级openssh版本
- 解决NTPD漏洞,升级Ntpd版本
- 独家 | 手把手教TensorFlow(附代码)
- HBase Region自动切分细节
- eclipse搭建ssh后台
- 解决mysql漏洞 Oracle MySQL Server远程安全漏洞(CVE-2015-0411)
- im4java包处理图片
- centOS7 mini配置linux服务器(五) 安装和配置tomcat和mysql
- RedisPool操作Redis,工具类实例
- centOS7 mini配置linux服务器(四) 配置jdk
- 老司机教你“飙”EventBus3
- Android listView异步下载和convertView复用产生的错位问题
- 实用Android 屏幕适配方案分享
- java-FFmpeg(一) 实现视频的转码和截图功能
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 别再用JSON配置文件了
- 什么,你一定要基于FPKM标准化表达矩阵做单细胞差异分析
- Tomcat 9最新版安装与使用手册,tomcat更改端口号,tomcat控制台乱码问题解决方法
- Python 技术篇-读取遍历指定路径的文件,区分文件和文件夹
- MySQL蜜罐获取攻击者微信ID
- PyQt5 技巧篇-增加一个类级变量,类级变量的设置方法,类级"常量"设置方法
- PyQt5 技巧篇-按钮隐藏并保留位置,设置按钮的可见度,设置按钮透明度
- PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态
- PyQt5 技巧篇-QWidget、Dialog界面固定大小设置
- 力扣:地下城游戏,手把手教你做困难题
- RN布局
- 学会MySQL主从复制读写分离,看这篇就够了
- Canal+Kafka实现MySQL与Redis数据同步
- 超详细canal入门,看这篇就够了
- 详细讲解!RabbitMQ防止数据丢失