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&…

【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…

【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…

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 长连…

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

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

简单谈谈我参加数据分析省赛的感受与体会

数据分析省赛的感受与体会 概要考试前的感受与体会考试注意事项小结 概要 大数据分析省赛指的是在省级范围内举办的大数据分析竞赛活动。该竞赛旨在鼓励和推动大数据分析领域的技术创新和人才培养,促进大数据技术与应用的深度融合,切实解决实际问题。参…

Android中级——MVVM

MVVM MVVM是什么?MVVM实现前提ModelViewModelView MVVM是什么? Model-View-ViewMode架构,可看作MVP改进版,将此前Presenter的逻辑操作交给ViewMode中的Binder去处理 Mode:封装数据存储及相关操作逻辑,与MV…

Kali Linux 安装搭建 hadoop 平台 详细教程

1)前期环境准备:(虚拟机、jdk、ssh) 2)SSH相关配置 安装SSH Server服务器:apt-get install openssh-server 更改默认的SSH密钥 cd /etc/ssh mkdir ssh_key_backup mv ssh_host_* ssh_key_backup 创建新…

【C++进阶(八)】C++继承深度剖析

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 继承 1. 前言2. 继承的基本概念3. 继承关系和访…

酷开会员值得回味的经典老剧还记得吗?酷开系统家庭影院带你重温

那些年,大家的娱乐生活主要集中在那一台9寸的黑白电视机中;那些年,家家户户的孩子们晚上都会聚到电视机前欢声笑语;那些年,是诸多经典的电视剧陪伴了很多人的闲暇时光……那些年陪伴我们成长,在记忆中熠熠生…

下笔如有神:用VS Code写markdown

文章目录 Markdown All in One快捷键指令 输出PDFMarkdown Preview Enhancedmarkdown基本语法 Markdown All in One VS Coode中最推荐的Markdown插件是Markdown All in One,下文简称为mdAIO。千万别搜完markdown后下一个叫Markdown的插件,这个插件的名字…

新年学新语言Go之四

一、前言 任何编程语言都有类型系统,类型系统解决了数据的存取问题,它决定了使用这个类型需要开辟内存空间大小以及数据是如何存放的,也解决如何读出数据,因为在内存中相同二进制值不同类型的含义是不一样的,关于Go基…

Oracle的立场:官网更换首页与以色列站在一起

Oracle公司的官网,更换了首页内容,明确表明立场:Oracle与以色列站在一起。 声明指出: Oracle谴责针对以色列及其公民的恐怖袭击。Oracle将为其员工、以色列政府和国防机构提供一切必要的支持。 Magen David Adom是一家为以色列公民…

1024,毕业后工作的五个月

入职 一晃一下又到了1024,彼时已经成为打工人在写分享了,自己已经搬砖5个月了,总感觉4月份拍毕业照、去川渝毕业旅行看plmm还是在昨天,但五月下旬入职到现在已经5个月了。给大家简单的share一下工作和生活。 在5月初光速毁约ks入…