什么是Filter(过滤器)?
什么是Filter(过滤器)?
Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
过滤器原理
当我们使用过滤器时,过滤器会对游览器的请求进行过滤,过滤器可以动态的分为3个部分,1.放行之前的代码,2.放行,3.放行后的代码,这3个部分分别会发挥不同作用。
第一部分代码会对游览器请求进行第一次过滤,然后继续执行
第二部分代码就是将游览器请求放行,如果还有过滤器,那么就继续交给下一个过滤器
第三部分代码就是对返回的Web资源再次进行过滤处理
我们使用过滤器,也就是说,不止请求会经过过滤器,我们的响应也会经过过滤器。
创建过滤器(Filter)
1.先书写一个普通类,如果普通类实现了Filter接口,则此类为过滤器类
public class Filter1 implements Filte
让普通类实现接口中的抽象方法,然后决定是否放行
package com.bjpowernode.filter;import javax.servlet.*; import java.io.IOException;public class Filter1 implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}}
Filter接口有3个方法,但是这里我们值实现一个,我们实现了一个doFilter方法,这个方法就是我们写过滤代码的地方,(另外两个我们会在生命周期里面讲解)
3.在web.xml文件配置过滤器的过滤路径或者通过注解方式配置(Filter的两种配置方式)
3.1注解方式
如果我们使用注解方式的话需要先了解属性,那么我们来先看一下源码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package javax.servlet.annotation;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.servlet.DispatcherType;@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebFilter {String description() default "";String displayName() default "";WebInitParam[] initParams() default {};String filterName() default "";String smallIcon() default "";String largeIcon() default "";String[] servletNames() default {};String[] value() default {};String[] urlPatterns() default {};DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST};boolean asyncSupported() default false;
}
里面的配置还是很多的,这里我们只讲解我们需要使用的
filterName:该filter的名字
initParams:初始化参数
displayName:filter显示名称
servletNames:指定对哪些servlet进行过滤
asyncSupported:是否支持异步模式
urlPatterns:指定拦截路径
value:指定拦截路径 (urlPatterns和value是一样的。只能配置一个,两个都配置就会报错)
注解配置
@WebFilter("/*") <!--过滤的路径-->这里的(/*)表示过滤所有的,里面的多个参数用 **,** 进行分隔。
注意:如果我们仅仅需要配置一个拦截路径,那么我们可以直接简写@WebLister(“拦截路径”),如@WebFilter(“/*”)就是拦截所有请求。
3.2xml方式配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><filter><filter-name>filter1</filter-name><filter-class>com.bjpowernode.filter.Filter1</filter-class> <!--过滤器--></filter><filter-mapping><filter-name>filter1</filter-name><url-pattern>/*</url-pattern> <!--过滤的路径-->表示过滤所有的</filter-mapping>
</web-app>
这个就是xml配置方式,里面属性都是一样的,这个和Servlet的配置方式基本一样,这里就不再赘述了。
使用过滤器(Filter)
我们先来感受一下如何使用过滤器,其它细节我们后面会一 一讲解。
package com.bjpowernode.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*") // 注解方式
public class Filter1 implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("对request进行过滤");filterChain.doFilter(servletRequest,servletResponse); // 放行System.out.println("对request完成过滤");}}
然后 启动服务器,然后我们在游览器中输入<http://localhost:8080你会看到如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFqohHGR-1667654438454)(C:\Users\ADMINI~1\AppData\Local\Temp\1667648186406.png)]
注意:上面之所以出现这个页面是因为我们服务器下面没有资源。
然后我们打开后台你会看到如下图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FjL0XkeO-1667654438457)(C:\Users\ADMINI~1\AppData\Local\Temp\1667648386995.png)]
从上面的执行结果来看,我们此时就可以得出结论,过滤器是不会管资源是否存在的,而只会对配置的拦截路径进行拦截
1.1 Fliter(过滤器)的生命周期
同servlet对象一样,Filter对象的创建也是交给web服务器完成的,在web服务器创建和使用及最后销毁filter时,会调用filter对应的方法
初始化方法:
public void init(FilterConfig filterConfig);
和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
拦截请求方法
public void doFilter
这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL的时候,Servlet过滤器将先执行doFilter方法。FilterChain参数用于访问后续过滤器。
销毁方法**
什么是Filter(过滤器)?相关推荐
- [JAVA EE] Filter过滤器
Filter过滤器 ◼ 过滤器(Filter)可以动态地拦截请求和响应. ◼ 应用场景:过滤敏感词汇.防止SQL注入.设置字符编码.进行URL级 别的权限访问控制.压缩响应信息等. 启动文件DemoA ...
- Filter(过滤器)
一.Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作. 1.Filter快速入门 1.1.步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方 ...
- filter[过滤器]使用大全
一.页面编码过滤器 1.开发EncodingFilter.java文件,继承自javax.servlet.Filter: package bluemoon.crm.systemmanage.strut ...
- (JavaWeb)Filter过滤器
Filter过滤器 Filter:过滤器,用来过滤网站的数据. 自动登录 统一设置编码格式 访问权限控制 敏感字符过滤等 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或serv ...
- Spring MVC在参数绑定前通过Filter过滤器改变请求参数的值
第一步,对request请求进行增强: /*** author: zhangxueliang* date: 2019-08-23*/ public class ParameterServletRequ ...
- spring boot Filter过滤器的简单使用
springboot使用Filter过滤器有两种方式: 一种是实现Filter接口然后通过@Component注解向项目加入过滤器 另一种是通过配置类来配置过滤器 @Component public ...
- 【Servlet】Filter过滤器详解、使用示例
Filter过滤器讲解 定义 过滤器处于浏览器与servlet之间,是一个实现了 javax.servlet.Filter 接口的 Java 类 客户端发送的请求.服务器发送的资源,需要通过过滤器,才 ...
- JBuilder9+Weblogic8.1——Filter过滤器在Jbuilder9中的运用
JBuilder9+Weblogic8.1--Filter过滤器在Jbuilder9中的运用 一.首先建立工程FilterTest,建立Web Application,名称也为FilterTest. ...
- java filter教程_Java Web Filter 过滤器学习教程(推荐)
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...
- vue+filter过滤器(多参数)传参 - 代码篇
vue+filter过滤器(多参数)传参 - 代码篇 传1个参数 //html {{a1 | filterAa}} //js filters:{filterAa(a1){// a1是传入的参数} } ...
最新文章
- 图灵奖获得者 Alan Kay:突破常规思维,创建下一代科研社区(附视频)
- Linux内存管理(经典)
- python怎么更新数据库_在Python的Django框架中更新数据库数据的方法
- POJ 1426	Find The Multiple BFS
- 应对用户需求的四个要点-企业数字化转型外部:驱动力之客户篇...
- pycharm 激活相关
- Matlab2016a如何关联M文件
- 怎么从apk源码中查看服务器地址,反编译apk查看源码
- 数列极限的性质与判定
- 网络安全---数字签名
- FishEye Crucible分析
- 软件设计师——数据流图
- 图像篡改入门02 利用空间结构篡改定位
- “无法建立到信任根颁发机构的证书链问题解决,根证书的导入方法
- 十四届全国大学生“恩智浦”杯智能汽车竞赛信标组总结(2)
- 一键备份脚本backup.sh
- 用计算机程序实现离散化的对象模型,模糊PID应用
- C#中设计器的控件事件转到逻辑代码
- 使用宝塔创建PHP网站,出现“no input file specified“错误的解决方案。
- EZStation如何添加解码器?
热门文章
- NLP(二)文本生成 --VAE与GAN模型和迁移学习
- Muduo Acceptor连接类
- 喜马拉雅 FM--- [ Java 高级开发] [ Java 架构师] [iOS 架构师] 招聘啦
- MindStudio训练营第一期
- 新西兰转基因奶牛,奶水质量高
- 通过backblaze b2云存储加cloudflare免费cdn回流,白嫖10G不限流免费图床
- html innerhtml 绑定事件无效,innerHTML 中添加onclick步骤 不管用
- python如何读写字典到文件
- mysql:列类型之整数(tinyint、smallint、mediumint、int、bigint)
- Linux文件IO_02