Java中过滤器与拦截器的使用

目录

Filter过滤器

Filter作用时机

Filter的使用

过滤器链

过滤器执行顺序

测试

Filter实现简单登陆验证

Interceptor拦截器

Interceptor的使用

Interceptor的拦截路径

Interceptor执行时机

Interceptor实现登录验证

Filter与Interceptor区别


Filter过滤器

Filter是JavaWeb三大组件(Servlet、Filter、Listener)之一。可以把对资源的请求拦截下来,从而实现一些特殊的功能。

过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

Filter作用时机

Filter的使用

首先在自己的Filter类上添加@WebFilter注解

也需要在引导类上添加@ServletComponentScan注解(因为Filter不是SpringBoot的组件)

@WebFilter("/*")
public class DemoFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("初始化方法,只会执行一次");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("所有的请求都需要执行一次该方法");//放行chain.doFilter(request,response);System.out.println("Controller执行完毕返回Filter");}@Overridepublic void destroy() {System.out.println("销毁方法,也只执行一次");}
}
@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("login")public void login(){System.out.println("进行了登录验证");}
}

启动服务器,浏览器访问localhost:8080/user/login地址观察控制台输出

过滤器链

当一个Web服务存在多个过滤器时,会形成一个过滤器链

过滤器执行顺序

过滤器执行顺序根据字符串的自然排序来执行,即由A到Z的顺序。

测试

现在创建A、B两个过滤器

@WebFilter("/*")
public class AFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("执行A过滤器放行前方法");chain.doFilter(request, response);System.out.println("执行A过滤器放行后方法");}
}
@WebFilter("/*")
public class BFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("执行B过滤器放行前方法");chain.doFilter(request, response);System.out.println("执行B过滤器放行后方法");}
}

运行访问请求地址观察控制台输出 

Filter实现简单登陆验证

@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("login")public void login(HttpServletRequest request){request.getSession().setAttribute("token","ok");System.out.println("进行了登录验证");}@RequestMapping("/query")public void query(){System.out.println("查询成功");}
}
@WebFilter("/*")
public class DemoFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;String uri = req.getRequestURI();System.out.println(uri);//如果是登录请求则放行if (uri.contains("login")) {chain.doFilter(request, response);return;}Object token = req.getSession().getAttribute("token");if (token == null) {System.out.println("还没有进行登录");return;}if (token.equals("ok")) {//已经登陆成功 放行chain.doFilter(request, response);}}
}

先访问/user/query路径观察控制台输出

登陆后再次访问观察输出。

Interceptor拦截器

Interceptor是Spring提供的,用来动态拦截Controller的方法执行。

作用是拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。

Interceptor的使用

在拦截器类上添加注解@Component并实现HandlerInterceptor接口。

@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("目标资源方法执行前执行。放行返回true,不放行返回false");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("目标资源方法执行后执行");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("视图渲染完毕后执行");}
}

我们除了定义拦截器类之外,还需要将拦截器注册到Spring中。添加一个配置类

@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {//注册拦截器registry.addInterceptor(loginInterceptor).addPathPatterns("/**");}
}

访问/user/query路径观察控制台输出

Interceptor的拦截路径

与过滤器有一个不同就是

  • /*:只能拦截一级路径意思是只能拦截/user而不能拦截/user/query
  • /**:拦截任意路径

在注册时除了可以配置拦截路径外还可以配置排除拦截路径

Interceptor执行时机

Interceptor实现登录验证

我们在配置里设置了排除对登录请求路径的拦截,那么在拦截器中只需要在执行Controller其他方法之前查询是否登录过即可

@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String uri = request.getRequestURI();System.out.println(uri);Object token = request.getSession().getAttribute("token");if (token == null) {System.out.println("还没有进行登录");return false;}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("目标资源方法执行后执行");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("视图渲染完毕后执行");}
}

Filter与Interceptor区别

  • 过滤器需要实现的是FIlter接口,而拦截器需要实现HandlerInterceptor接口
  • 过滤器会拦截所有的请求路径。而拦截器只会拦截Spring中存在的请求路径

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/111529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

25.1 MySQL SELECT语句

1. SQL概述 1.1 SQL背景知识 1946年, 世界上诞生了第一台电脑, 而今借由这台电脑的发展, 互联网已经成为一个独立的世界. 在过去几十年里, 许多技术和产业在互联网的舞台上兴衰交替. 然而, 有一门技术却从未消失, 甚至日益强大, 那就是SQL.SQL(Structured Query Language&…

面试经典150题——Day15

文章目录 一、题目二、题解 一、题目 135. Candy There are n children standing in a line. Each child is assigned a rating value given in the integer array ratings. You are giving candies to these children subjected to the following requirements: Each chil…

【C++面向对象】1. 类、对象

文章目录 【 1. 类 & 对象的定义 】1.1 类的定义1.2 对象的定义 【 2. 类的成员 】2.1 数据成员2.2 成员函数类的内部定义成员函数类的外部定义成员函数成员函数的访问实例 【 3. 类的访问修饰符 】3.1 public 公有成员3.2 private 私有成员3.3 protected 保护成员3.4 继承…

【离线/并查集】CF1213 G

想起来好久没写题解了,随便写一下把 感觉写多了div3后面的题就变得简单了,div3似乎没什么思维含量,甚至有时候能开出div3的2100.... 心血来潮写一下这个*1800的题解,思路一下就出了,但是一开始多了个log被卡了&#x…

工程化模式-进阶

幼年期:无模块化 成长期: IIFE是立即执行函数表 IIFE其实也就是匿名函数,归根结底都是函数 一种是申明式,一种是表达式。但是两种其实存在着不同,其中第二种中存在着变量提升 function fn1() var fn function ()v…

使用stream流根据对象属性对复杂list对象去重

日常开发中,我们可能会遇到这样一种情况,需要对数据库查询出来的数据进行一个二次处理,从而达到我们需要的数据结构。stream流正是java8提供的对复杂list操作方便工具。 我们先介绍如何使用stream流根据对象属性对复杂list对象去重&#xff0…

1最新动态

已经入驻面包多了 地址:https://mbd.pub/o/author-a26am2hoZQ/work

【R】数据相关性的可视化

一千零一技|相关性分析及其可视化:copy&paste,搞定 .libPaths(c("/bioinfo/home/software/miniconda3/envs/R4.0/lib/R/library")) #data("mtcars") library("PerformanceAnalytics") # pdf("test.pdf") #…

惊艳!这些独特的搜索引擎你都知道吗?

随着互联网的普及和发展,搜索引擎已经成为我们日常获取信息的重要工具。然而,当我们想要寻找一些特定类型的信息时,普通的搜索引擎可能无法满足我们的需求。这时,一些特殊的搜索引擎便能派上用场本。 文将介绍几种常用的特殊搜索引…

EDID详解

文章目录 字节含义一些概念YCC位 文章目录 字节含义一些概念YCC位 字节含义 EDID通常由128个字节组成,这些字节提供了关于显示器的各种详细信息。以下是EDID中每个字节位表示的一般含义: Header(头部): 字节0: Header&#xff…

全面预算管理软件

目前主流产品厂商是:Oracle(产品hyperion海波龙),SAP(BPC),IBM(TM1)Tagetik从意大利引入中国,元年做全面预算管理软件20年左右,元年C1全面预算管理…

前端开发规范总结

1、 前言 前端开发中,不同的开发者有不同的代码编写习惯,但实际项目中有的公司是需要协同开发的,想要高效的协同,规定一个大家都能接受的规范就尤为重要。 坚持好的代码风格规范,从你我做起。 2、代码规范的好处 …

hue实现对hiveserver2 的负载均衡

如果你使用的是CDH集群那就很是方便的 在Cloudera Manager中,进入HDFS Service 进入Instances标签页面,点击Add Role Instances按钮,如下图所示 点击Continue按钮,如下图所示 返回Instances页面,选择HttpFS角色…

【MyBatis】mvc模式以及Mapper文件中的namespace以及ORM思想

目录 什么是MVC三层架构,初步了解? namespace的作用是什么? Mapper文件中的namespace? ORM思想(对象关系映射思想) 其中提供了一套映射规则和API 什么是MVC三层架构,初步了解? 三…

9.构造器与垃圾收集器 对象的前世今生

9.1 对象与变量的生存空间 栈与堆:生存空间 在Java中,程序员会在乎内存中的两种区域:对象的生存空间堆(heap)和方法调用及变量的生存空间(stack)。当Java虚拟机启动时,它会从底层的…

【Netty专题】【网络编程】从OSI、TCP/IP网络模型开始到BIO、NIO(Netty前置知识)

目录 前言前置知识一、计算机网络体系结构二、TCP/IP协议族2.1 简介*2.2 TCP/IP网络传输中的数据2.3 地址和端口号2.4 小总结 三、TCP/UDP特性3.1 TCP特性TCP 3次握手TCP 4次挥手TCP头部结构体 3.2 UDP特性 四、总结 课程内容一、网络通信编程基础知识1.1 什么是Socket1.2 长连…

django REST framework-使用与不使用的区别?

首先,来回顾一下传统的基于模板引擎的 django 开发工作流: 绑定 URL 和视图函数。当用户访问某个 URL 时,调用绑定的视图函数进行处理。 编写视图函数的逻辑。视图中通常涉及数据库的操作。 在视图中渲染 HTML 模板,返回 HTTP 响应…

互联网摸鱼日报(2023-10-20)

互联网摸鱼日报(2023-10-20) 博客园新闻 OPPO让折叠机超越直板旗舰成为可能 特斯拉的“大空头”,是马斯克那张嘴 逃避内卷的年轻人,盯上了老年大学的音乐课 理想市值超蔚来1倍,一场属于增程式的胜利 补足折叠屏影像短板,OPPO…

软件工程与计算总结(十七)软件构造

一.概述 1.定义 软件构造是以编程为主的活动,类似于软件实现。但软件构造又不止编程这么简单,除了核心的编程任务之外,还设计详细设计(数据结构与算法设计)、单元测试、集成与集成测试以及其他活动~ 2.软件构造是设计…

redis,mq如何解决重复支付问题

重复支付问题可以通过以下方式解决: Redis解决重复支付问题:Redis可以使用它的原子性操作来避免重复支付问题。可以将每个订单的订单号作为一个key存储在Redis中,并设置一个过期时间。当客户付款时,先检查该订单号在Redis中是否存…