Filter过滤器-JavaWeb三大组件之一
Servlet、Filter、Listener是JavaWeb的三大组件,给Web开发提供了很大的便利。
什么是Filter?
Filter,过滤器。类似与生活中的净水器、空气净化器。
JavaWeb中Filter的作用:当浏览器请求访问服务器的资源时,过滤器可以将请求拦截下来,完成一下特殊的功能。例如:登录验证、统一编码处理、敏感字符过滤等。
Filter的基本使用
(1)定义一个类,实现接口Filter。
(2)实现Filter接口的方法
(3)配置拦截路径。可以用web.xml进行配置;Servlet 3.0以后还可以用注解进行配置。
示例1(注解配置):
@WebFilter("/index.jsp")
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤请求req的代码");
filterChain.doFilter(servletRequest,servletResponse); // 放行请求
System.out.println("增强响应resp的代码");
} @Override
public void destroy() { }
}
示例2(web.xml配置):
<?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_3_1.xsd"
version="3.1">
<filter>
<filter-name>filter1</filter-name>
<filter-class>com.chichung.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>filter1</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
</web-app>
上面两个示例的输出结果都是:
过滤请求req的代码
index...
增强响应resp的代码
说明,Filter的执行顺序是:
(1)执行过滤器放行代码上边的代码
(2)执行放行代码 filterChain.doFilter(servletRequest,servletResponse)
(3)执行放行后的资源 index.jsp
(4)回来执行过滤器放行代码下边的代码
所以Filter可以对请求对象进行过滤,还可以对响应对象进行功能上的增强,再返回给客户端。
关于拦截的配置
上面讲了一下两种配置拦截的两种方式。
下面是拦截路径的几种方式:
(1)具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
(2)拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
(3)后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
(4)拦截所有资源:/* 访问所有资源时,过滤器都会被执行
还有就是拦截方式的配置。什么是拦截方式呢?我们有些请求是直接访问jsp文件,有些请求是先访问Servlet,然后Servlet通过请求转发到到jsp显示。直接访问jsp文件我们可以用上面的示例代码解决,但是请求转发或者其他方式呢?
* 注解配置:
* 设置dispatcherTypes属性
1. REQUEST:默认值。浏览器直接请求资源
2. FORWARD:转发访问资源
3. INCLUDE:包含访问资源
4. ERROR:错误跳转资源
5. ASYNC:异步访问资源
* web.xml配置
* 设置<dispatcher></dispatcher>标签即可
过滤器的生命周期
Filter接口的三个方法:
1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
2. doFilter:每一次请求被拦截资源时,会执行。执行多次
3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
过滤器链(配置多个过滤器)
执行顺序:如果有两个过滤器:过滤器1和过滤器2
1. 过滤器1
2. 过滤器2
3. 资源执行
4. 过滤器2
5. 过滤器1
过滤器先后顺序问题:
1. 注解配置:按照类名的字符串比较规则比较,值小的先执行。例如: AFilter 和 BFilter,AFilter就先执行了。
2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行。
Filter过滤器-JavaWeb三大组件之一的更多相关文章
- 学习笔记_过滤器概述(过滤器JavaWeb三大组件之一)
过滤器Filter Filter和Lister是Servlet规范里的两个高级特性.不同于Servlet,它们不用于处理客户端请求,只用于对request.response进行修改或者对context ...
- 学习笔记_Filter小结(过滤器JavaWeb三大组件之一)
Filter小结 Filter的三个方法: l void init(FilterConfig):在Tomcat启动时被调用: l void destroy():在Tomcat关闭时被调用: l ...
- 学习笔记_过滤器详细_2(过滤器JavaWeb三大组件之一)
过滤器详细 5 四种拦截方式 我们来做个测试,写一个过滤器,指定过滤的资源为b.jsp,然后我们在浏览器中直接访问b.jsp,你会发现过滤器执行了! 但是,当我们在a.jsp中request.getR ...
- 学习笔记_过滤器详细(过滤器JavaWeb三大组件之一)
过滤器详细 1 过滤器的生命周期 我们已经学习过Servlet的生命周期,那么Filter的生命周期也就没有什么难度了! (l) init(FilterConfig):在服务器启动时会创建Filte ...
- JavaWeb三大组件—过滤器filter
JavaWeb三大组件 1. 都需要在web.xml中进行配置ServletListener(2个感知监听器不需要配置)Filter 2. 过滤器 它会在一组资源(jsp.servlet..css.. ...
- JavaWeb三大组件(Servlet、Filter、Listener)
JavaWeb三大组件指的是:Servlet.Filter.Listener,这三个组件在JavaWeb开发中分别提供不同的功能,然而很多人可能只用过其中一个或者两个(Servlet.Filter,比 ...
- JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)
JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference
- JavaWeb三大组件
一.JavaWeb三大组件 Servlet,Listener,Filter.它们在JavaWeb开发中分别提供不同的功能. JavaWeb三大组件都必须在Web.xml中配置 二.三大组件 1.Ser ...
- 转-JavaWeb三大组件之Listener监听器
JavaWeb三大组件之Listener监听器一.概述1,它是一个接口,内容由我们来实现 2,它需要注册,例如注册在按钮上 3,监听器中的方法,会在特殊事件发生时被调用 二.JavaWeb中的监听器1 ...
随机推荐
- Android Studio下“Error:Could not find com.android.tools.build:gradle:2.2.1”的解决方法
ref from: Android Studio下“Error:Could not find com.android.tools.build:gradle:2.2.1”的解决方法http://blog ...
- RabbitMQ 中 Connection 和 Channel 详解
我们知道无论是生产者还是消费者,都需要和 RabbitMQ Broker 建立连接,这个连接就是一条 TCP 连接,也就是 Connection. 一旦 TCP 连接建立起来,客户端紧接着可以创建一个 ...
- array_unshift() 函数用于向数组插入新元素。新数组的值将被插入到数组的开头。
<?php $a=array("a"=>"red","b"=>"green"); array_unsh ...
- JAVA核心技术I---JAVA基本程序设计结构
一:讨论一个简单的Java程序 package hello; public class Hello { /** * @param args */ public static void main(Str ...
- 经典全屏滚动插件fullPage.js
要写简单可以写的很简单,对着github上面的参数和注释随便写了个demo.这个插件十分高端大气上档次,配上良好的配色和布局,简单几笔就可以把网站装扮得十分洋气. 唯一的缺点就是,感觉对移动端的兼容性 ...
- puppeteer截图
puppeteer是谷歌官方出品的一个通过 DevTools 协议控制 headless Chrome 的Node库.可以通过Puppeteer的提供的api直接控制Chrome模拟大部分用户操作来进 ...
- [php]php总结(2)
18.数组$arr[null] = 20; //array([]=>20)$arr[] = 20;//默认为下一个下标赋值unset()可以删除数组元素,但不会重建索引array_values( ...
- exec操作文件描述符
exec命令可以用来替代当前shell:换句话说,并没有启动子shell.使用这一命令时任何环境都将被清除,并重新启动一个shell. 它的一半形式为: exec command 其中,command ...
- Linux dig命令
dig(Domain Information Groper),和nslookup作用有些类似,都是DNS查询工具 1.dig命令格式 dig @dnsserver name querytype 如果你 ...
- pandas空值处理与插值
# coding:utf-8 import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.int ...