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三大组件之一的更多相关文章

  1. 学习笔记_过滤器概述(过滤器JavaWeb三大组件之一)

    过滤器Filter Filter和Lister是Servlet规范里的两个高级特性.不同于Servlet,它们不用于处理客户端请求,只用于对request.response进行修改或者对context ...

  2. 学习笔记_Filter小结(过滤器JavaWeb三大组件之一)

    Filter小结 Filter的三个方法: l  void init(FilterConfig):在Tomcat启动时被调用: l  void destroy():在Tomcat关闭时被调用: l  ...

  3. 学习笔记_过滤器详细_2(过滤器JavaWeb三大组件之一)

    过滤器详细 5 四种拦截方式 我们来做个测试,写一个过滤器,指定过滤的资源为b.jsp,然后我们在浏览器中直接访问b.jsp,你会发现过滤器执行了! 但是,当我们在a.jsp中request.getR ...

  4. 学习笔记_过滤器详细(过滤器JavaWeb三大组件之一)

    过滤器详细 1 过滤器的生命周期 我们已经学习过Servlet的生命周期,那么Filter的生命周期也就没有什么难度了! (l)  init(FilterConfig):在服务器启动时会创建Filte ...

  5. JavaWeb三大组件—过滤器filter

    JavaWeb三大组件 1. 都需要在web.xml中进行配置ServletListener(2个感知监听器不需要配置)Filter 2. 过滤器 它会在一组资源(jsp.servlet..css.. ...

  6. JavaWeb三大组件(Servlet、Filter、Listener)

    JavaWeb三大组件指的是:Servlet.Filter.Listener,这三个组件在JavaWeb开发中分别提供不同的功能,然而很多人可能只用过其中一个或者两个(Servlet.Filter,比 ...

  7. JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下)

    JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference

  8. JavaWeb三大组件

    一.JavaWeb三大组件 Servlet,Listener,Filter.它们在JavaWeb开发中分别提供不同的功能. JavaWeb三大组件都必须在Web.xml中配置 二.三大组件 1.Ser ...

  9. 转-JavaWeb三大组件之Listener监听器

    JavaWeb三大组件之Listener监听器一.概述1,它是一个接口,内容由我们来实现 2,它需要注册,例如注册在按钮上 3,监听器中的方法,会在特殊事件发生时被调用 二.JavaWeb中的监听器1 ...

随机推荐

  1. [NOI2011]阿狸的打字机——AC自动机之fail树的利用

    Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...

  2. unity生成Android apk

    前提:本文默认你安装了unity5.6版本,不是这个版本的没有Gradle(new)选项,也默认你安装了Android Studio并配置好了环境变量. Gradle(new):打包Android S ...

  3. WHY C++ ?(by Herb Sutter) & C++17 standard

    WHY C++ ? C++

  4. sort 与 sorted 区别

    sort 与 sorted 区别: sort 只是应用在 list 上的方法,(就地排序无返回值). sorted 是内建函数,可对所有可迭代的对象进行排序操作,(返回新的list). 语法 sort ...

  5. 数据库sharding系列好文收藏

    部分摘自于:http://my.oschina.net/u/188625/blog/104743 1. 又拍网架构中的数据库分库设计 . http://blog.csdn.net/nanjingjia ...

  6. 跨域问题 Uncaught DOMException: Blocked a frame with origin。。。

    第三方系统内嵌 到iframe中的 跨域问题. 解决方案: http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html

  7. Android 6.0 7.0 8.0 一个简单的app内更新版本-okgo app版本更新

    登陆时splash初始页调用接口检查app版本.如有更新,使用okGo的文件下载,保存到指定位置,调用Android安装apk. <!-- Android 8.0 (Android O)为了针对 ...

  8. # 20155209 2016-2017-2 《Java程序设计》第六周学习总结

    20155209 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基 ...

  9. Linux基础之权限-你弄得明白吗?

    使用编辑文件passwd的方式添加用户natasha用户ID为1000,组ID为555 在shadow文件中添加natasha用户的信息 在group文件中添加natasha的属组ID为555 为na ...

  10. UNIX环境高级编程 第7章 进程环境

    本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开 ...