1、过滤器的基本概念和作用

在网站的页面访问时,我们往往需要做一些控制,如普通用户无法访问VIP用户的页面。如果在每一个需要访问控制的文件中都加上判断代码,那么代码将会很冗余,一旦需要统一修改时也极其繁琐。

过滤器就可以解决这样的问题,配置完成的过滤器,会强制让指定的页面在访问之前先从过滤器走一趟。



2、过滤器相关的API

Servlet API中,与过滤器有关的API共有三个接口,分别是:
  • Filter
  • FilterChain (在Filter中init方法作为参数)
  • FilterConfig (在Filter中doFilter方法作为参数)

Filter接口
Filter接口是我们自定义的过滤器类必须要实现的接口,该接口有三个方法:
  • init(FilterConfig filterConfig)
  • 该方法是对Filter对象进行初始化的方法,仅在容器初始化Filter对象结束后被调用一次,其中FilterConfig可以获取初始化参数

  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  • 该方法是Filter进行过滤操作的方法,是最重要的方法。我们自定义的过滤器类都要实现该方法。
  • 方法体中可以对请求和响应进行预处理,FilterChain则可以将处理后的请求响应传递到过滤链上的下一个资源

  • destroy()
  • 该方法在容器销毁过滤器对象之前被调用

可以看到,其他两个接口是分别作为参数在Filter接口的方法中进行使用。它们的作用在于:

FilterConfig接口
该接口类型作为Filter接口中init方法的参数使用,这个接口有一个常用方法:
  • getInitParameter(String name)
  • 该方法用来获取过滤器的初始化参数,这个初始化参数在web.xml中进行配置,方式和Servlet初始化参数类似

FilterChain接口
该接口类型作为Filter接口中doFilter方法的参数使用,这个接口有一个方法:
  • doFilter(ServletRequest request, ServletResponse response)
  • 该方法可以将当前请求和相应传递到过滤链上的下一个资源,可能是下个过滤器,也可能是目标资源

3、示例:过滤器限制页面访问时间

实现这样的功能,某个页面,在规定的时间内才能访问,否则跳转到通知页面,告知未到开放时间,暂时无法访问。

可以通过修改系统的时间,来完成过滤器的效果测试:

3.1 创建jsp页面

创建四个jsp页面:index、login、home和notice,文件放置目录结构如下:

3.2 自定义过滤器

自定义过滤器,读取初始参数配置,并判断是否符合要求,根据需要进行页面跳转:
public class TimeFilter implements Filter {
private int start = 0;
private int end = 24; public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("TimeFilter初始化,开始抓取初始化参数");
start = Integer.parseInt(filterConfig.getInitParameter("start"));
end = Integer.parseInt(filterConfig.getInitParameter("end"));
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("TimeFilter过滤");
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
int curHour = calendar.get(Calendar.HOUR_OF_DAY);
if (curHour >= end || curHour < start) {
request.setAttribute("start", start);
request.setAttribute("end", end);
request.getRequestDispatcher("/WEB-INF/notice.jsp").forward(request, response);
} chain.doFilter(request, response);
} public void destroy() {
System.out.println("TimeFilter爆炸");
}
}
x
 
1
public class TimeFilter implements Filter { 
2
    private int start = 0;
3
    private int end = 24;
4

5
    public void init(FilterConfig filterConfig) throws ServletException {
6
        System.out.println("TimeFilter初始化,开始抓取初始化参数");
7
        start = Integer.parseInt(filterConfig.getInitParameter("start"));
8
        end = Integer.parseInt(filterConfig.getInitParameter("end"));
9
    }
10

11
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
12
        System.out.println("TimeFilter过滤");
13
        Calendar calendar = Calendar.getInstance();
14
        calendar.setTime(new Date());
15
        int curHour = calendar.get(Calendar.HOUR_OF_DAY);
16
        if (curHour >= end || curHour < start) {
17
            request.setAttribute("start", start);
18
            request.setAttribute("end", end);
19
            request.getRequestDispatcher("/WEB-INF/notice.jsp").forward(request, response);
20
        }
21
        
22
        chain.doFilter(request, response);
23
    }
24

25
    public void destroy() {
26
        System.out.println("TimeFilter爆炸");
27
    }
28
}

3.3 配置web.xml和初始化参数

在web.xml中配置过滤器的具体类,以及过滤的资源和过滤器初始化的参数:
<filter>
<filter-name>timeFilter</filter-name>
<filter-class>com.zker.TimeFilter</filter-class>
<init-param>
<param-name>start</param-name>
<param-value>15</param-value>
</init-param>
<init-param>
<param-name>end</param-name>
<param-value>22</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>timeFilter</filter-name>
<url-pattern>/limit/*</url-pattern>
</filter-mapping>
16
 
1
<filter>
2
    <filter-name>timeFilter</filter-name>
3
    <filter-class>com.zker.TimeFilter</filter-class>
4
    <init-param>
5
        <param-name>start</param-name>
6
        <param-value>15</param-value>
7
    </init-param>
8
    <init-param>
9
        <param-name>end</param-name>
10
        <param-value>22</param-value>
11
    </init-param>
12
</filter>
13
<filter-mapping>
14
    <filter-name>timeFilter</filter-name>
15
    <url-pattern>/limit/*</url-pattern>
16
</filter-mapping>

4、Filter使用总结和配置说明

  • 首先要实现Filter接口
  • 自定义的过滤方法写在doFilter方法体中,最后并通过形参 FilterChain 的 doFilter(request, response) 方法传递请求和响应
  • 然后要在web.xml中进行配置,包括过滤器的具体类,过滤文件,初始参数等

关于配置文件的部分说明:
  • <filter>  定义Filter的具体类
  • <init-param>  定义初始化参数
  • <filter-mapping>  定义过滤器的限制目录

在<filter-mapping>中实际上还可以通过 <dispatcher> 配置请求方式的过滤:
<filter-mapping>
<filter-name>timeFilter</filter-name>
<url-pattern>/limit/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
 
1
<filter-mapping>
2
    <filter-name>timeFilter</filter-name>
3
    <url-pattern>/limit/*</url-pattern>
4
    <dispatcher>REQUEST</dispatcher>
5
    <dispatcher>FORWARD</dispatcher>
6
    <dispatcher>INCLUDE</dispatcher>
7
    <dispatcher>ERROR</dispatcher>
8
</filter-mapping>

<dispatcher>配置表示哪些请求传递方式到如上的/limit/*时需要被过滤,默认不写的话为REQUEST
(假如我只写了REQUEST,而没写FORWARD,那么通过转发方式到达的/limit/*的资源,就不会被过滤)


[10] 过滤器 Filter的更多相关文章

  1. javaWeb学习总结(10)- Filter(过滤器)学习(2)

    在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...

  2. javaWeb学习总结(10)- Filter(过滤器)学习

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

  3. javaWeb学习总结(10)- Filter(过滤器)常见应用(3)

    一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html Form请求参数的中文问题 package me.gacl.web.filter; import java.io. ...

  4. 一、变量.二、过滤器(filter).三、标签(tag).四、条件分支tag.五、迭代器tag.六、自定义过滤器与标签.七、全系统过滤器(了解)

    一.变量 ''' 1.视图函数可以通过两种方式将变量传递给模板页面 -- render(request, 'test_page.html', {'变量key1': '变量值1', ..., '变量ke ...

  5. 通过定义过滤器filter解决跨域问题

            跨域是比较常见问题,比较简单的方式就是直接定义一个过滤器filter,然后在请求头里面加上一些参数.下面来看看具体的写法吧. 一.java代码 package com.hj.usera ...

  6. java Web 过滤器Filter详解

    简介 Filter也称之为过滤器,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊 ...

  7. SpringBoot系列教程web篇之过滤器Filter使用指南扩展篇

    前面一篇博文介绍了在 SpringBoot 中使用 Filter 的两种使用方式,这里介绍另外一种直接将 Filter 当做 Spring 的 Bean 来使用的方式,并且在这种使用方式下,Filte ...

  8. (十三)过滤器Filter(转)

    --------转自孤傲苍狼博客 一.Filter简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例 ...

  9. springCloud学习05之api网关服务zuul过滤器filter

    前面学习了zuul的反向代理.负载均衡.fallback回退.这张学习写过滤器filter,做java web开发的对filter都不陌生,那就是客户端(如浏览器)发起请求的时候,都先经过过滤器fil ...

随机推荐

  1. servlet实现登陆注册

    拿到信息必须进行非空验证用servlet做注册登陆时,在form表单的action中不用加后缀.java,jsp文件需要加 public boolean CheckParm(String...args ...

  2. 一篇深入剖析PCA的好文

    主成分分析(Principal components analysis)-最大方差解释 在这一篇之前的内容是<Factor Analysis>,由于非常理论,打算学完整个课程后再写.在写这 ...

  3. 命令行创建Maven项目卡住以及出错解决办法。

    第一次通过命令行创建maven项目.结果,果不其然啊,还是出问题了,不过出问题比没有出问题强,知道哪里有问题并学会解决也是一种收获. 遇到的第一个问题,在从仓库下载东西的时候会卡住,我开始以为是网速问 ...

  4. extjs6中grid里放置图片

    1.加黑体的是实现代码,在view中操作 /** * Created by Wwei on 2017/7/1. */ Ext.define('Admin.view.userpanoram.UserPa ...

  5. 永久关闭selinux | 防火墙

    关闭SELinux的两种方法 1 永久方法 – 需要重启服务器 修改/etc/selinux/config文件中设置SELINUX=disabled ,然后重启服务器. 2 临时方法 – 设置系统参数 ...

  6. 第一章 [分布式CMS]

    第一次准备写一个完整的例子, 也是正在做的一个项目! 准备记录一下"心路历程".... 项目为分布式的CMS 前期架构分为,单点登录,结构系统,资源云,文档云 ,DB服务,工具服务 ...

  7. shell之算数运算符、逻辑运算符、关系运算符、布尔运算符、文件测试运算符

    注意事项: (1)bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用: (2)完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Es ...

  8. WIN7+IE8环境QTP11不能录制和识别web对象的解决方法

    在项目稍微空闲的时间,在办公电脑上面装上QTP11来学习.但是发现在录制脚本时无法录制web对象,在网上找解决方法说以管理员的身份运行QTP就可以解决无法录制的问题,用这方法证明是ok的.后来用Obj ...

  9. MySQL之数据的备份与还原

    备份db_book:这里用到了cmd,以管理员方式运行,不然后面使用mysqldump会被拒绝访问!!! 1.启动cmd,输入命令,切换到MySQL的bin文件: 2.然后输入备份命令: 备份好的sq ...

  10. Spring AOP术语解释

    话说,越来越感觉有些人解释概念真的是晦涩难懂,我刚开始学习Spring aop时,对那些切入点,连接点,引入等概念搞得头疼.太多人就直接照搬定义,让我们这些初学者如何理解啊.下面是我找了大量的博客,终 ...