什么是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
  1. 让普通类实现接口中的抽象方法,然后决定是否放行

    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(过滤器)?相关推荐

  1. [JAVA EE] Filter过滤器

    Filter过滤器 ◼ 过滤器(Filter)可以动态地拦截请求和响应. ◼ 应用场景:过滤敏感词汇.防止SQL注入.设置字符编码.进行URL级 别的权限访问控制.压缩响应信息等. 启动文件DemoA ...

  2. Filter(过滤器)

    一.Filter过滤器(重要) Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作. 1.Filter快速入门 1.1.步骤: 1. 创建一个类实现Filter接口 2. 重写接口中方 ...

  3. filter[过滤器]使用大全

    一.页面编码过滤器 1.开发EncodingFilter.java文件,继承自javax.servlet.Filter: package bluemoon.crm.systemmanage.strut ...

  4. (JavaWeb)Filter过滤器

    Filter过滤器 Filter:过滤器,用来过滤网站的数据. 自动登录 统一设置编码格式 访问权限控制 敏感字符过滤等 过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或serv ...

  5. Spring MVC在参数绑定前通过Filter过滤器改变请求参数的值

    第一步,对request请求进行增强: /*** author: zhangxueliang* date: 2019-08-23*/ public class ParameterServletRequ ...

  6. spring boot Filter过滤器的简单使用

    springboot使用Filter过滤器有两种方式: 一种是实现Filter接口然后通过@Component注解向项目加入过滤器 另一种是通过配置类来配置过滤器 @Component public ...

  7. 【Servlet】Filter过滤器详解、使用示例

    Filter过滤器讲解 定义 过滤器处于浏览器与servlet之间,是一个实现了 javax.servlet.Filter 接口的 Java 类 客户端发送的请求.服务器发送的资源,需要通过过滤器,才 ...

  8. JBuilder9+Weblogic8.1——Filter过滤器在Jbuilder9中的运用

    JBuilder9+Weblogic8.1--Filter过滤器在Jbuilder9中的运用 一.首先建立工程FilterTest,建立Web Application,名称也为FilterTest. ...

  9. java filter教程_Java Web Filter 过滤器学习教程(推荐)

    一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...

  10. vue+filter过滤器(多参数)传参 - 代码篇

    vue+filter过滤器(多参数)传参 - 代码篇 传1个参数 //html {{a1 | filterAa}} //js filters:{filterAa(a1){// a1是传入的参数} } ...

最新文章

  1. 图灵奖获得者 Alan Kay:突破常规思维,创建下一代科研社区(附视频)
  2. Linux内存管理(经典)
  3. python怎么更新数据库_在Python的Django框架中更新数据库数据的方法
  4. POJ 1426 Find The Multiple BFS
  5. 应对用户需求的四个要点-企业数字化转型外部:驱动力之客户篇...
  6. pycharm 激活相关
  7. Matlab2016a如何关联M文件
  8. 怎么从apk源码中查看服务器地址,反编译apk查看源码
  9. 数列极限的性质与判定
  10. 网络安全---数字签名
  11. FishEye Crucible分析
  12. 软件设计师——数据流图
  13. 图像篡改入门02 利用空间结构篡改定位
  14. “无法建立到信任根颁发机构的证书链问题解决,根证书的导入方法
  15. 十四届全国大学生“恩智浦”杯智能汽车竞赛信标组总结(2)
  16. 一键备份脚本backup.sh
  17. 用计算机程序实现离散化的对象模型,模糊PID应用
  18. C#中设计器的控件事件转到逻辑代码
  19. 使用宝塔创建PHP网站,出现“no input file specified“错误的解决方案。
  20. EZStation如何添加解码器?

热门文章

  1. NLP(二)文本生成 --VAE与GAN模型和迁移学习
  2. Muduo Acceptor连接类
  3. 喜马拉雅 FM--- [ Java 高级开发] [ Java 架构师] [iOS 架构师] 招聘啦
  4. MindStudio训练营第一期
  5. 新西兰转基因奶牛,奶水质量高
  6. 通过backblaze b2云存储加cloudflare免费cdn回流,白嫖10G不限流免费图床
  7. html innerhtml 绑定事件无效,innerHTML 中添加onclick步骤 不管用
  8. python如何读写字典到文件
  9. mysql:列类型之整数(tinyint、smallint、mediumint、int、bigint)
  10. Linux文件IO_02