servlet过滤器的简单使用

article/2025/10/15 9:05:28

为什么要用过滤器或者拦截器?

简单来讲,当一个账户需要进入某个系统调用某个接口时,我们需要对其进行相应验证,否则一旦接口暴露,可能会造成系统崩溃。这个时候我们就需要用拦截器对调用接口一方进行身份验证。

servlet过滤器的简单使用

第一种:使用servlet注解方式

首先,新建一个springboot工程,引入pom:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional>
</dependency>

其次,新建一个过滤器类:
在这里插入图片描述
在这里插入图片描述
以下是过滤器详细代码(都是servlet的包):

package com.zhisen.uud.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
//传统过滤器实现。
@WebFilter(filterName = "filter2", urlPatterns = "/*")
public class aTestFilter implements Filter{@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)throws IOException, ServletException {// TODO Auto-generated method stubSystem.out.println("过滤器a执行了");arg2.doFilter(arg0, arg1);}}

然后再主类中加入注解,扫描过滤器:
在这里插入图片描述

最后可以自己在controller建一个接口,用Postman测一下。会发现在接口内容之前过滤器发生了作用。

补充:
当两个拦截器拦截的内容相同时,会根据工程的类名进行字符串比较,然后挨个进行过滤,例如:
在这里插入图片描述
当两个过滤器拦截的都为 ‘/*’时,他的执行顺序为,aTestFilter – bTestFilter – 接口

第二种:使用Spring注册Bean的方式

首先,创建一个Filter类实现Filter接口(代码同上,除了注解):
在这里插入图片描述
然后再配置类中注册一个bean(里面指定过滤的路径,设置过滤器名称,级别):
在这里插入图片描述
之后调用接口,观看结果。

使用注解方式实现三层过滤(日志,参数,权限)

主类:

package com.zhisen.uud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;@SpringBootApplication
//传统的过滤器,去扫描固定包下的
@ServletComponentScan("com.zhisen.uud.filter")
public class UudApplication {public static void main(String[] args) {SpringApplication.run(UudApplication.class, args);}}

接口:

package com.zhisen.uud.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class restTemplateController {
//	无参数传递@GetMapping("/test")public Map<String,Object> test1(){Map<String,Object> result = new HashMap<String, Object>();result.put("A01", "post");try {
//			Thread.sleep(2000);} catch (Exception e) {// TODO: handle exception}System.out.println("A01执行了!");return result;}//	无参数传递@GetMapping("/test1")public Map<String,Object> test2(){Map<String,Object> result = new HashMap<String, Object>();result.put("A02", "post");try {
//			Thread.sleep(2000);} catch (Exception e) {// TODO: handle exception}System.out.println("A02执行了!");return result;}
}

第一层过滤器:

package com.zhisen.uud.filter;import java.io.IOException;
import java.util.Date;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;@WebFilter(filterName = "filterc", urlPatterns = "/*")
public class cTestFilter implements Filter{//	第一过滤器作日志@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)throws IOException, ServletException {// TODO Auto-generated method stubString ipString = arg0.getRemoteAddr();Date startDate = new Date();String path = ((HttpServletRequest) arg0).getRequestURI();System.out.println("来自地址:{"+ipString+"} 请求url:{"+path+"} 请求时间:{" +startDate+"}");arg2.doFilter(arg0, arg1);Date fisnishDate = new Date();System.out.println("执行时长:{"+ (fisnishDate.getTime()-startDate.getTime())+"}毫秒");}}

第二层过滤器:

package com.zhisen.uud.filter;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;@WebFilter(filterName = "filterd", urlPatterns = "/*")
public class dTestFilter implements Filter{@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)throws IOException, ServletException { // TODO Auto-generated method stubSystem.out.println("参数过滤器执行中");String nameString = arg0.getParameter("userName");//arg0.setAttribute(arg0, arg1); //设置属性,他不是参数if (null == nameString || "".equals(nameString)) {System.out.println("缺少必要参数userName");arg1.setContentType("application/json;charset=utf-8");PrintWriter writer = arg1.getWriter();writer.write("{\"status\":0,\"msg\":\"缺少必要参数userName\"}");
//			arg2.doFilter(arg0, arg1);} else {arg2.doFilter(arg0, arg1);}System.out.println("参数过滤器执行完毕");}}

第三层过滤器:

package com.zhisen.uud.filter;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;import org.springframework.web.bind.annotation.RequestMapping;@WebFilter(filterName = "filtere", urlPatterns = "/*")
public class eTestFilter implements Filter {@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)throws IOException, ServletException {// TODO Auto-generated method stubSystem.out.println("权限过滤器执行中");String path = ((HttpServletRequest) arg0).getRequestURI();if ("/test".equals(path)) {arg2.doFilter(arg0, arg1);} else {String tockenString = arg0.getParameter("token");if (null == tockenString || "".equals(tockenString)) {System.out.println("没有权限");arg1.setContentType("application/json;charset=utf-8");PrintWriter writer = arg1.getWriter();writer.write("{\"status\":0,\"msg\":\"没有权限\"}");} else {arg2.doFilter(arg0, arg1);}}System.out.println("权限过滤器执行完毕");}}

参数齐全结果:
在这里插入图片描述
在这里插入图片描述
缺少token:
在这里插入图片描述
在这里插入图片描述
缺少userName:
在这里插入图片描述
在这里插入图片描述

制作整理不易,以上内容均为原创(参考了部分官方文档和老师整理的案例)。如要引用请附上本文链接,如有疑问可以在评论区畅所欲言,作者看到会第一时间回复,欢迎交流!


http://chatgpt.dhexx.cn/article/1fqTtaCV.shtml

相关文章

Servlet过滤器Filter

Servlet Filter 又称 Servlet 过滤器&#xff0c;它是在 Servlet 2.3 规范中定义的&#xff0c;能够对 Servlet 容器传给 Web 资源的 request 对象和 response 对象进行检查和修改。Filter 不是 Servlet&#xff0c;不能直接访问&#xff0c;它本身也不能生成 request 对象和 r…

Servlet之过滤器

问题引入 以往的Servlet中&#xff0c;有冗余代码&#xff0c;多个servlet都要进行编写 概念 过滤器(Filter)是处于客户端于服务器资源之间的一道技术。 图示&#xff1a; 过滤器的作用 执行地位在Servlet之前&#xff0c;客户端发送请求时&#xff0c;会先经过Filter&#xff…

servlet过滤器的介绍

servlet过滤器是服务器与客户端请求与响应的中间层组件&#xff0c;它主要是用于对浏览器的请求进行过滤处理&#xff0c;并将过滤后的请求再转给下一个资源。 servlet过滤器的基本概念 Servlet过滤器从字面上的字意理解为经过一层次的过滤处理才达到使用的要求&#xff0c;而…

Servlet——过滤器(fiter)

什么是过滤器&#xff1f; 过滤器是Servlet的一个组件&#xff0c;是设计模式中过滤器模式&#xff08;又叫责任链模式&#xff09;的一种经典实现 是Servlet技术中最激动人心的技术&#xff0c;WEB开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff…

java基础篇---Servlet过滤器

Servlet过滤器从字面上的字意理解为景观一层次的过滤处理才达到使用的要求&#xff0c;而其实Servlet过滤器就是服务器与客户端请求与响应的中间层组件&#xff0c;在实际项目开发中Servlet过滤器主要用于对浏览器的请求进行过滤处理&#xff0c;将过滤后的请求再转给下一个资源…

mac下idea卡顿问题解决

一、背景 mac下idea卡顿 二、原因 赋予idea的内存太小了&#xff0c;需要给他更大的内存 三、解决方法 1、修改idea.vmoptions 配置文件。 help --Edit Custom VM Options 2、修改文件 这是我修改之前的&#xff1a; -Xms128m -Xmx750m -XX:ReservedCodeCacheSize512m…

macOS看视频卡顿如何修复

很多时候我们都会遇到这样一个问题&#xff1a;明明电脑很新&#xff0c;处理器内存什么的也都不差&#xff0c;但看在线视频就是卡&#xff0c;画面和音频对不上&#xff0c;令人很难受。其实这是Flash播放器开了P2P的原因。今天我就教教大家macOS看视频卡顿如何修复。 先打开…

MAC 外接键盘卡顿处理

系统偏好设置-> 键盘。 1&#xff1a;将『按键重复』调到快&#xff0c;将『重复前延迟』调到段&#xff0c;点击『更改键盘类型』,并且按照提示一步步让电脑识别键盘。 2 &#xff1a;切换『文本』&#xff0c;去勾『触控栏键入建议』&#xff0c;可以起到调优作用。

MAC如何解决idea卡顿问题

故事是这样的 我的mac配置也不是很高&#xff0c;内存大概是这样的 但是刚下载完idea后&#xff0c;简直比我之前2000块的windows本都卡。偶买噶&#xff0c;差点想直接退货。 好在控制住脾气&#xff0c;然后冷静思考后觉得&#xff0c;不该呀&#xff0c;好歹那么贵&#x…

matlab java mac_Matlab for mac卡顿、抛Java异常

在苹果上使用Matlab后&#xff0c;试用了几个版本后都十分卡顿&#xff0c;后来抛出了Java.lang.OutOfMemoryError. 后查阅资料认为可能是Matlab JVM内存不够的问题。官方给出的解决方案如下&#xff0c;将JVM内存设置到最大后&#xff0c;情况有所缓解。有时候仍然有些卡 但是…

解决 Macbook 连接蓝牙鼠标卡顿问题

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 2.4Ghz的蓝牙与2.4Ghz的Wi-Fi起冲突&#xff0c;环境干扰大。会造成蓝牙鼠标卡顿具体解决办法如下&#xff1a; 打开“系统偏好设置”——“网络”&#xff0c;然后选择更多这里&#xff08;如图&#xff09…

优化不必要的动画,以减少Mac卡顿

本文通过两种方式来减少Mac的动画&#xff0c;友情提示&#xff1b;常重启有助于保持Mac系统正常运转。 条件允许的情况下&#xff0c;安装旧版本Mac系统、减少运行不必要的软件能优化Mac运行速度。 一、系统设置 打开系统偏好设置——>辅助功能 勾选 “减弱动态效果” …

终极方案——解决MacBook/Mac mini连接无线鼠标卡顿、漂移

终极方案——解决MacBook/Mac mini连接无线鼠标卡顿、漂移 Intel处理器机器/旧版Mac系统Apple M系列新机器 Intel处理器机器/旧版Mac系统 找到如图设置&#xff0c;修改网络首选项顺序 Apple M系列新机器 1、在系统设置里新建一个管理员用户 2、在访达-前往-电脑-磁盘-找到新建…

m1 MacBook Pro pycharm打字卡顿问题解决

一般m1芯片的MacBook Pro在pycharm中打字卡顿无非两种情况导致的&#xff0c;一种是分配给pycharm编辑器的内存太小&#xff1b;另一种是下载的版本与m1芯片版本不一致&#xff0c;不兼容导致的卡顿&#xff0c;下面文章详细记录了解决这两种情况的方法。 一、内存不足导致的卡…

Macbook Pro 鼠标卡顿问题

Macbook Pro 鼠标卡顿问题 目前无解&#xff0c;只能改善。该问题最早能追溯到 2015年。 https://jingyan.baidu.com/article/ff42efa93632c5c19e220208.html 原因 据说是无线频段冲突。 罗技低于400 的鼠标就别看了&#xff0c;白花钱。 鼠标在 macbook pro 的卡顿现象主要表现…

解决 Macbook 连接蓝牙鼠标卡顿、飘的现象

原因&#xff1a; 1. 鼠标蓝牙缺陷&#xff0c;蓝牙版本低&#xff0c;电池电量低&#xff1b; 2. 电脑性能卡顿和功能优先度&#xff1b; 3. 2.4Ghz的蓝牙与2.4Ghz的Wi-Fi起冲突&#xff0c;环境干扰大。 这里以解决2和3的问题。 打开“系统偏好设置”——“网络”&#…

Mac卡顿问题处理

导读 1.文件清理 2.网络卡顿问题 文件清理 网络卡顿问题

苹果电脑mac系统运行卡顿 反应慢怎么办?

Mac电脑以生产力著称&#xff0c;卡顿几乎很少发生。但是随着日常的使用&#xff0c;系统空间越来越多&#xff0c;随之而来的问题就是存储空间不足&#xff0c;无法保存文件。如果mac同时运行的软件过多&#xff0c;也会造成卡顿&#xff0c;所以mac电脑并不是不会卡顿&#x…

mac电脑运行很卡不流畅,如何给mac提速?

是不是发现你的 Mac 越用越慢&#xff1f;没错&#xff0c;任何电子设备&#xff0c;随着使用时间的增加&#xff0c;都会出现不如刚买时那么流畅的问题。论其究竟&#xff0c;除了硬件随着时间的损耗&#xff0c;其实还有一部分原因是日常留下的“使用痕迹”和自启动的应用程序…

MacBook苹果笔记本电脑卡顿怎么解决?

MacBook使用时间久了之后很容易出现卡顿的问题。那么出现卡顿的原因有哪些呢&#xff1f;MacBook卡顿怎么处理呢&#xff1f;下面为大家介绍几种可能的解决方案。虽然mac系统相对来说比较稳定&#xff0c;但遇到软件崩溃的情况也会突然卡顿而无法使用。那么&#xff0c;遇上mac…