javaweb之Filter详解

     一、概念:

Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

二、Filter简介

Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。
   三、快速入门
1、新建一个类,实现Filter接口
2、实现doFilter()方法,打印一句话,来证明能够进行拦截
3、在web.xml中进行配置(参照Servlet配置)
4、访问一个页面,看看能不能拦截
1>
[java] view plaincopy
package com.test.filter; 
 
import java.io.IOException; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
public class Demo1Filter implements Filter { 
    private FilterConfig filterConfig; 
 
    public void doFilter(ServletRequest request, ServletResponse response, 
            FilterChain chain) throws IOException, ServletException { 
        System.out.println("Demo1过滤前"); 
        System.out.println(filterConfig.getInitParameter("param1")); 
        chain.doFilter(request, response);//放行。让其走到下个链或目标资源中 
        System.out.println("Demo1过滤后"); 
    } 
 
    public void init(FilterConfig filterConfig) throws ServletException { 
        System.out.println("初始化了"); 
        this.filterConfig = filterConfig; 
    } 
 
    public void destroy() { 
        System.out.println("销毁了"); 
    } 

2>在web.xml中进行配置
[html] view plaincopy
<filter> 
    <filter-name>Demo1Filter</filter-name> 
    <filter-class>com.itheima.filter.Demo1Filter</filter-class> 
    <init-param> 
        <param-name>param1</param-name> 
        <param-value>value在这里呢</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>Demo1Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> <!-- 没有配置dispatcher就是默认request方式的 --> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
</filter-mapping> 

四、Filter的应用场景
通过对filter过滤器的了解,可以得知在以下三种情况下可以做些处理:
1> 通过控制对chain.doFilter的方法的调用,来决定是否需要访问目标资源。
比如,可以在用户权限验证等等。判断用户是否有访问某些资源的权限,有权限放行,没权限不执行chain.doFilter方法。
2> 通过在调用chain.doFilter方法之前,做些处理来达到某些目的。
比如,解决中文乱码的问题等等。可以在doFilter方法前,执行设置请求编码与响应的编码。甚至可以对request接口进行封装装饰来处理get请求方式的中文乱码问题(重写相应的request.getParameter方法)。
3> 通过在调用chain.doFilter方法之后,做些处理来达到某些目的。
比如对整个web网站进行压缩。在调用chain.doFilter方法之前用类A对response对象进行封装装饰,重写getOutputStream和重写getWriter方法。在类A内部中,将输出内容缓存进ByteArrayOutputStream流中,然后在chain.doFilter方法执行后,获取类A中ByteArrayOutputStream流缓存数据,用GZIPOutputStream流进行压缩下。
五、Filter实现拦截的原理
Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下filter的doFilter方法。
六、Filter生命周期
和Servlet一样Filter的创建和销毁也是由WEB服务器负责。不过与Servlet区别的是,它是1>在应用启动的时候就进行装载Filter类(与Servlet的load-on-startup配置效果相同)。2>容器创建好Filter对象实例后,调用init()方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。3>当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。4>当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。
注意:init方法与destroy方法只会直接一次。
七、Filter部署应用注意事项
1> filter-mapping标签中servlet-name与url-pattern。
Filter不仅可以通过url-pattern来指定拦截哪些url匹配的资源。而且还可以通过servlet-name来指定拦截哪个指定的servlet(专门为某个servlet服务了,servlet-name对应Servlet的相关配置)。
2> filter-mapping标签中dispatcher。
指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。
REQUEST:
当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问或ERROR情况时,那么该过滤器就不会被调用。
INCLUDE:
如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:
如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:
如若在A.jsp页面page指令中指定了error属性=examError.jsp,那么A.jsp中若出现了异常,会跳转到examError.jsp中处理。而在跳转到examError.jsp时,若过滤器配置了ERROR的dispather那么则会拦截,否则不会拦截。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pause容器作用_Kubernetes学习之pause容器

根据代码看到,pause容器运行着一个非常简单的进程,它不执行任何功能,一启动就永远把自己阻塞住了,它的作用就是扮演PID1的角色,并在子进程称为"孤儿进程"的时候,通过调用wait()收割这个子进程,这样就不用担心我们的Pod的PID namespace里会堆满僵尸进程了,这也是为什么…

Spring Integration –轮询文件的创建和修改

1引言 文件支持是Spring Integration与外部系统通信的另一个端点。 在这种情况下&#xff0c;它提供了几个组件来读取&#xff0c;写入和转换文件。 在这篇文章中&#xff0c;我们将编写一个监视目录的应用程序&#xff0c;以便读取其中的所有文件。 具体而言&#xff0c;它执行…

为什么需要消息队列MQ

主要原因&#xff1a;是在高并发情况下&#xff0c;由于来不及同步处理&#xff0c;请求往往会发生堵塞&#xff0c;比如诸多的insert、update之类的请求同时到达mysql&#xff0c;直接导致无数的行锁表锁&#xff0c;甚至最后请求会堆积很多&#xff0c;从而触发大量的too man…

数据库连接池的使用

关于数据库连接池的使用&#xff0c;首先我们要明白我们为什么要用它&#xff0c;对应普通的数据库连接操作&#xff0c;通常会涉及到以下一些操作是比较耗时的&#xff1a; 网络通讯&#xff0c;涉及到网络延时及协议通讯身份验证&#xff0c;涉及安全性检查连接合法性检查&a…

mysql基础知识整理_MYSQL基础知识整理

目录1、客户端命令2、服务器端命令3、常用数据类型3.1、数值型3.2、字符型3.3、日期时间型3.4、布尔型4、mysql的执行方式5、用户管理1、客户端命令客户端命令不需要以分号结尾 &#xff0c;如果想获取客户端命令的帮助信息则&#xff1a;mysql> helpmysql常用客户端命令如下…

python 学习DAY11

动态传参 形参* # 聚合所有位置参数的实参 实参* #打散一个位置参数成多个 形参** #聚合所有关键词参数 实参** #打散实参的关键词参数 命名空间 第一种 内置名称空间 第二种 全局名称空间 第三中 局部名臣空间 作用域 全局作用域(是内置的,全局也可以调用) 局部作用域(局部可调…

【网络技术设备安全】BGP 基础与概述-2-中转 AS 中的 IBGP 路由传递

0x01 中转 AS 中的 IBGP 路由传递 参考该图&#xff1a; 上图&#xff0c;我们模拟一个 1.0 的路由通过 AS 65101 来传递 1&#xff1a;通过图可知&#xff0c;A 与 B 之间的 Peer 为 EBGP&#xff0c;B 与 E 之间为 Peer IBGP&#xff0c;E 与 F 之间为 Peer EBGP 邻接 2&a…

python函数变量的作用域_学不会的Python函数——变量作用域

1. LEGB函数Python中&#xff0c;程序的变量并不是在哪个位置都可以访问的&#xff0c;访问权限决定于这个变量是在哪里赋值的。我们先来看一段代码。上述代码有两个变量a&#xff0c;当在test函数中输出变量a的值是&#xff0c;为什么输出的是20&#xff0c;而不是10呢&#x…

浅谈JSP表单中的form传值

不同JSP页面之间、不同action之间,以及JSP中form与其对应的action之间,JSP中form与其不对应的action之间如何传值。本文将介绍JSP表单中的form传值。 JSP表单中的form传值 页面间链接和数据传递的三种方式 &#xff08;1&#xff09;通过JSP表单form将数据提交到下一个页面&…

react.js从入门到精通(一)

web端三大框架react、vue和angular&#xff0c;下面是对react.js的一些总结。 一、环境搭建 1、npm搭建项目 推荐使用npm搭建项目环境&#xff0c;如果网速过慢&#xff0c;可是使用cnpm进行项目的搭建&#xff08;cnpm是淘宝的npm镜像&#xff0c;与npm有些差异&#xff0c;有…

java 代码冲突检测_Java中常见的代码冲突

java 代码冲突检测在工作中&#xff0c;最近我对现有Java项目进行了代码清理。 完成该练习后&#xff0c;我可以看到在代码中一次又一次地发生了一组常见的代码冲突。 因此&#xff0c;我想出了此类常见违规的清单&#xff0c;并与同行共享&#xff0c;以提高安全意识&#xff…

ubuntu 编译mysql_Ubuntu编译MySQL5

编译MySQL5源码提示 No curses/termcap library found&#xff0c;但安装curses termcap都提示已经安装。编译时加上路径即可解决&#xff0c;即./conf编译MySQL5源码提示 No curses/termcap library found&#xff0c;但安装curses termcap都提示已经安装。编译时加上路径即可…

WIN7下搭建FTP

步骤如下&#xff1a; 一、 二、 三、 四、 五、 六、 七、 八、 九、检验 注意&#xff1a;只有本机可以访问ftp&#xff0c;外部电脑无法访问ftp&#xff1f;可能是防火墙未关闭。

Android调用系统拍照裁剪和选图功能

最近项目中用到修改用户头像的功能,基本上都是模板代码,现在简单记录一下. 调用系统拍照private fun openCamera() { //调用相机拍照// 创建File对象&#xff0c;用于存储拍照后的图片var outputImage File(externalCacheDir, "output_image.jpg")try {if (outputI…

忘记番石榴:5个Google库Java开发人员应该知道的

什么是最有用但未知的Google Java库&#xff1f; 如果我们在激烈的黑客马拉松中阻止某人并要求她命名一个受欢迎的Google Java库&#xff0c;那么答案可能就是Guava。 这也就不足为奇了&#xff0c;因为它的主要重点是提高开发人员的生产力。 但是其他Google图书馆呢&#xff…

VS在win32平台与mysql链接_mysql5.5.28-win32 + qt--4.8.2-vs2008 数据库驱动编译与连接...

我们来编译配置qt的mysql数据库驱动&#xff0c;首先看看官方文档的说明&#xff0c;如下How to Build the QMYSQL Plugin on WindowsYou need to get the MySQL installation files.RunSETUP.EXEand choose "Custom Install".Install the "Libs & Include …

JAVA知识学习——类的修饰符

Java程序在定义类时&#xff0c;除了使用class关键字标识之外&#xff0c;还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性。类的修饰符分为访问控制符和非访问控制符两大类。修饰符之间的先后排列次序对类的性质没有任何影响。一&#xff0c;非访问修饰符。 1…

神秘的数组初始化_I / O神秘化

神秘的数组初始化由于对高度可扩展的服务器设计的所有炒作以及对Node.js的狂热&#xff0c;我一直想重点研究IO设计模式&#xff0c;直到现在为止都没有足够的时间进行投资。 现在已经做了一些研究&#xff0c;我认为最好记下我遇到的东西&#xff0c;作为对我以及可能遇到这篇…

mysql characteristic_MySQL存储过程定义中的特性(characteristic)的含义

MySQL的存储过程蛮啰嗦的&#xff0c;与MSSQL或者Oracle的存储过程相比&#xff0c;如果没有显式指定&#xff0c;他会隐含地指定一系列特性(characteristic)的默认值来创建存储过程通常在使用图形界面工具进行存储过程编写的时候&#xff0c;图形界面工具会自动加上这部分内容…

hive 案例分析

转自 http://www.cnblogs.com/guanhao/p/5641675.html 1. 创建数据库&#xff0c;切换数据库 create database testdb2; use testdb2; 2. 创建管理表 create table emp( empno int, empname string, job string, mgr int, hiredate string, salary double, comm double, deptn…