JavaWeb 之 Filter:过滤器
一、Filter 概述
1、概念
Filter 过滤器是 JavaWeb 的三大组件之一。(Servlet、Filter、Listener)
Filter 过滤器它是 JavaEE 的规范,可以在浏览器以及目标资源之间起到一个过滤的作用,它的作用是:拦截请求,过滤响应。
web 中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
2、作用
拦截请求常见的应用场景有:
① 登录验证;
② 权限检查;
③ 事务管理;
④ 统一编码处理;
⑤ 敏感字符等等
二、使用步骤
1、定义一个类,实现接口 Filter
2、实现 doFilter() 方法
3、配置拦截路径
① web.xml 配置
格式:
<!--filter 标签用于配置一个 Filter 过滤器-->
<filter>
<!--给 filter 起一个别名-->
<filter-name>AdminFilter</filter-name>
<!--配置 filter 的全类名-->
<filter-class>com.atguigu.filter.AdminFilter</filter-class>
</filter>
<!--filter-mapping 配置 Filter 过滤器的拦截路径-->
<filter-mapping>
<!--filter-name 表示当前的拦截路径给哪个 filter 使用-->
<filter-name>AdminFilter</filter-name>
<!-- url-pattern 配置拦截路径,可以有多个拦截路径
/ 表示请求地址为: http://ip:port/工程路径/ 映射到 IDEA 的 web 目录
/admin/* 表示请求地址为: http://ip:port/工程路径/admin/*
-->
<url-pattern>/admin/*</url-pattern>
<url-pattern>/client/*</url-pattern>
</filter-mapping>
② 注解方式配置
在类上添加 @WebFilter() 即可,里面填写访问所要拦截的资源的路径。
4、代码实现
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException; @WebFilter("/*")
public class FirstFilter implements Filter {
public void destroy() {
}
// doFilter 方法,专门用于拦截请求,过滤响应
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("filterDemo1被执行了....");
// 放行操作
chain.doFilter(req, resp);
} public void init(FilterConfig config) throws ServletException { } }
5、Filter 的工作流程图
三、Filter 的生命周期
Filter 的生命周期包含几个方法:
1、构造器方法
执行时机:在 web 工程启动的时候执行(Filter 会创建)
2、init 初始化方法
执行时机:在 web 工程启动的时候,构造方法执行完,立刻执行 init 方法,做一些初始化的操作
3、doFilter 方法
执行时机:每次访问目标资源时都会调用,每次拦截到请求,就会执行(执行多次);
4、destroy 方法
执行时机:停止 web 工程的时候,就会执行(停止 web 工程,也会销毁 Filter 过滤器),用来释放资源
四、Filter 接口
Filter 是一个接口,给我们提供了下面三个方法
Filter 接口,实现 Filter 需要实现该接口。
(1)init() 方法用于初始化 Filter;
(2)doFilter() 是过滤请求和响应的主要方法;
(3)destory() 用于在 Filter 对象被销毁前做收尾工作,如是否资源等;
五、FilterConfig 类
FilterConfig 类是 Filter 过滤器的配置文件类。
Tomcat 每次创建 Filter 的时候,也会同时创建一个 FilterConfig 类,这里面包含了 Filter 配置文件的配置信息。
FilterConfig 对象在服务器调用 init() 方法时传递进行。
FilterConfig 类的作用是获取 filter 过滤器的配置内容:
getFilterName():获取 Filter 的名称 filter-name 的内容;
getSerletContext():获取ServletContext 对象(即 application)
getInitParameter():获取在 Filter 中配置的 init-param 初始化参数;
getInitParameterNames():获取所有初始化参数的名字;
Demo:
web.xml 的配置:
<!--filter 标签用于配置一个 Filter 过滤器-->
<filter>
<!--给 filter 起一个别名-->
<filter-name>AdminFilter</filter-name>
<!--配置 filter 的全类名--><filter-class>com.atguigu.filter.AdminFilter</filter-class>
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost3306/test</param-value>
</init-param>
</filter> Filter 代码:
public void init(FilterConfig filterConfig) throws ServletException { // 1、 获取 Filter 的名称 filter-name 的内容
System.out.println("filter-name 的值是: " + filterConfig.getFilterName()); // 2、 获取在 web.xml 中配置的 init-param 初始化参数
System.out.println("初始化参数 username 的值是: " + filterConfig.getInitParameter("username"));
System.out.println("初始化参数 url 的值是: " + filterConfig.getInitParameter("url")); // 3、 获取 ServletContext 对象
System.out.println(filterConfig.getServletContext());
}
六、FilterChain 过滤器链
FilterChain 对象是在 doFilter() 方法被调用时作为参数传递进来的。
doFilter() 方法用于调用 Filter 链上的下一个过滤器,如果当前过滤器为最后一个,过滤器则将请求发送到目标资源。
FilterChain 过滤器链(多个过滤器如何一起工作)
(1)执行顺序:如果有两个过滤器:过滤器1和过滤器2
① 过滤器1前置代码
② 过滤器2前置代码
③ 资源执行 doFilter()
④ 过滤器2 后置代码
⑤ 过滤器1 后置代码
(2)过滤器先后顺序问题
① 注解配置:
规则:按照类名的字符串比较规则比较,值小的先执行。
如: AFilter 和 BFilter,AFilter就先执行了。
② web.xml 配置:
规则: 按照 <filter-mapping> 的顺序决定的,如果定义的位置越靠前,越先被调用;
(3)多个 Filter 过滤器执行的特点
① 所有 Filter 和目标资源默认都执行在同一个线程中;
② 多个 Filter 共同执行的时候,它们都是使用同一个 Request 对象;
执行流程图:
七、Filter 的拦截路径(目标资源)
目标资源指的是需要调用 Filter 来进行过滤处理的资源。主要有以下几种配置方式:
1、精确匹配
通过 <filter-mapping> 下的 url-pattern 来配置
格式:
<url-pattern>/target.jsp</url-pattern>
以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp
精确匹配只要在请求地址完全一样时才会调用 Filter
2、目录匹配
路径匹配只要是所请求的资源在设置的路径下就会调用 Filter
格式:
<url-pattern>/admin/*</url-pattern>
以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*
3、后缀名匹配
后缀匹配只要访问的资源路径是以指定后缀结尾就会调用 Filter
格式:
<url-pattern>*.html</url-pattern>
以上配置的路径, 表示请求地址必须以.html 结尾才会拦截到
<url-pattern>*.do</url-pattern>
以上配置的路径, 表示请求地址必须以.do 结尾才会拦截到
<url-pattern>*.action</url-pattern>
以上配置的路径, 表示请求地址必须以.action 结尾才会拦截到
注意:Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!
4、使用 servlet-name 配置
通过 filter-mapping 中的 servlet-name 来指定过滤的 Servlet
在 Filter 的 filter-mapping 中增加了一个 servlet-name 标签,这个标签的值是其中某一个 servlet 的名字,在访问 Servlet 时就会调用该过滤器请求。
如图:
八、过滤器细节
2、过滤器的执行流程?
(1)执行过滤器
(2)执行要放行的资源
(3)回来执行过滤器放行代码下面的代码
3、过滤器的生命周期方法?
(1)init 方法:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次,一般用于加载资源。
(2)doFilter 方法:每一次请求被拦截资源时,会执行。执行多次
(3)destory 方法:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次,一般用于释放资源。
4、过滤器配置详解?
(1)拦截路径配置
1. 具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
2. 拦截目录: /admin/* 访问/user下的所有资源时,过滤器都会被执行
3. 后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
4. 拦截所有资源: /* 访问所有资源时,过滤器都会被执行
(2)拦截方式配置:资源被访问的方式
在 filter-mapping 还有一个子标签 dispatcher,该标签用来指定需要 Filter 处理的请求类型,该标签可以配置四个值
配置:
设置 dispatcherTypes 属性
属性名 | 解释 |
REQUEST | 默认值。浏览器直接请求资源 |
FORWARD | 转发访问资源时调用 Filter |
INCLUDE | 动态包含访问资源时调用Filter |
ERROR | 错误跳转资源 |
ASYNC | 异步访问资源 |
web.xml 配置:
设置 <dispatcher></dispatcher>标签,在里面填入上面的值即可。
以上四种情况可以设置一个,也可以同时设置多个,如果不设置默认是 Request。
JavaWeb 之 Filter:过滤器的更多相关文章
- 【JavaWeb】Filter 过滤器
Filter 过滤器 简介 Filter 过滤器是 JavaWeb 三大组件之一 Filter 过滤器是 JavaEE 的规范,也就是接口 Filter 过滤器的作用是 拦截请求,过滤响应 拦截请求的 ...
- javaweb之Filter过滤器详解
快速入门 1.新建一个类,实现Filter接口 2.实现doFilter()方法,打印一句话,来证明能够进行拦截 3.在web.xml中进行配置(参照Servlet配置) 4.访问一个页面,看看能不能 ...
- JavaWeb之Filter过滤器
原本计划这一篇来总结JSP,由于JSP的内容比较多,又想着晚上跑跑步减减肥,所以今天先介绍Filter以及它的使用举例,这样的话还有些时间可以锻炼锻炼.言归正传,过滤器从字面理解她的话有拦网.过滤的功 ...
- JavaWeb -- Servlet Filter 过滤器
1. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技术,开发人员可以实现用户在 ...
- javaweb的Filter过滤器设置全站编码
FIlter配置全站编码有一种方法是重写getParameter方法,也就是继承HttpServletRequestWrapper在重写getParameter方法,还有一种就是如下: public ...
- Introduction of Servlet Filter(介绍javaweb组件之一过滤器filter)
javaweb的三大组件都需要交给web服务器运行,都需要在web.xml文件中配置. ①Servlet:javax.servlet.Servlet通过http协议接受客户端的请求,并作出响应的Jav ...
- Filter过滤器-JavaWeb三大组件之一
Servlet.Filter.Listener是JavaWeb的三大组件,给Web开发提供了很大的便利. 什么是Filter? Filter,过滤器.类似与生活中的净水器.空气净化器. JavaWeb ...
- javaweb学习总结(四十二)——Filter(过滤器)学习
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态 ...
- javaWeb学习总结(10)- Filter(过滤器)学习
一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有 web资源:例如Jsp, Servlet, 静 ...
随机推荐
- 原创:【ajax | axios跨域简单请求+复杂请求】自定义header头Token请求Laravel5后台【亲测可用】
如标题:我想在ajax的header头增加自定义Token进行跨域api认证并调用,api使用laravel5编写,如何实现? 首先,了解下CORS简单请求和复杂请求. -- CORS简单请求 -- ...
- 时间管理GTD
时间管理—重要紧急四象限法则https://www.jianshu.com/p/30b2ab0dc20e<番茄工作法图解>—— 让你的工作高效起来https://www.jianshu.c ...
- 在easyui-tabs中的href或 content的多种条件下的不同页面内容和页面地址的赋值?
$('#tt').tabs('add', {.....});中 的 加载内容, 可以用content, 或用 href都是可以的. 虽然它们加载 的方式不一样, 但是 只要是加载进去后, 加载成功后, ...
- odoo开发笔记 -- 还原数据库后,异常:ir_attachment: IOError: [Errno 2] No such file or directory: u'/var/...'
场景描述: 恢复Odoo数据后,抛出错误导致无法进入页面 -- ::, INFO aeo odoo.addons.base.ir.ir_attachment: _read_file reading / ...
- k8s记录-k8s基本概念和术语
每次个节点上当然都要运行Docker.Docker来负责所有具体的映像下载和容器运行. Kubernetes主要由以下几个核心组件组成: etcd保存了整个集群的状态: apiserver提供了资源操 ...
- Postgresql单表【插入】/【更新】百万数据
一.插入数据 说到插入数据,一开始就想到: insert int A values(*******************) 插入多条数据,最多想到:写成这样: insert into A value ...
- LeetCode_475. Heaters
475. Heaters Easy Winter is coming! Your first job during the contest is to design a standard heater ...
- jQuery prop方法替代attr方法
jquery attr()方法获取标签的 checked 会有问题,所以用了 prop() 方法.
- Linux——xargs命令学习
有时候我们会遇到需要将指定命令返回结果进行处理的情况 这种情况下,可能就需要写for循环之类的脚本进行处理了(目前我只能想到这种方法) 但是想起来还有一个xargs命令,组合这个命令就比较省事了. 场 ...
- Entity Framework Core for Console
包 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.SqlServer Microsoft.EntityFrameworkCor ...