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. Big Endian与Litter Endian

    Big Endian是大端,Litter Endian是小端,意思很明了,但是很难记住谁是谁.每次涉及到这个概念的时候,我都会GOOGLE一下,浪费精力. 怎样才能永远记住他们呢?网上搜索了一下,有很 ...

  2. jFreeChart利用CategoryDatase,ChartFactory.createBarChart生成的柱状图

    package com.potevio.rnd; import java.io.File; import java.io.FileNotFoundException; import java.io.F ...

  3. 通过maven test 报org.apache.ibatis.binding.BindingException: Invalid bound statement

    背景 直接使用eclipse工具去执行,没有问题,通过testng.xml去执行,没有问题,但通过mvn clean test执行,就报错,提示org.apache.ibatis.binding.Bi ...

  4. Http2改造实践:statusText丢失问题

    背景: 1.项目中的nginx由http1.1改造为http2, 2.代码中采用axios的interceptors做统一返回处理,对于系统逻辑性错误弹窗(例如:表单字段唯一性校验弹窗提示) 现象: ...

  5. HTML DOM (文档对象模型)

    当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. HTML DOM 树 通过可编程的对象模型,JavaScrip ...

  6. zetcode :: First programs in PyQt5

    练习代码,详见网站 http://zetcode.com/gui/pyqt5/firstprograms/ import sys from PyQt5 import QtWidgets from Py ...

  7. 浅谈服务器对SEO的影响,该如何选择服务器?

    对于SEO,很多人想的都是怎么做好网站的内部优化,做好外部推广.其实SEO没什么技术含量,到网上搜别人的心得看,千篇一律,都是翻来覆去的说一样的东西,就像吃不同人做的馒头,吃来吃去就是一个味道.笔者经 ...

  8. 记录-新建一个web应用的过程与曲折

    第一步/ 打开eclipse,菜单栏下,File–New–Other-,打开后找到web–Dynamic Web Project,然后单击Next. 解释一下,Dynamic ,动态的,变化的,Dyn ...

  9. 在Linux 环境下搭建 JDK 和 Tomcat

      在Linux 环境下搭建 JDK 和 Tomcat 参考地址:http://www.cnblogs.com/liulinghua90/p/4661424.html   [JDK安装] 1.首先下载 ...

  10. pycharm中的快捷键和简单设置

    PyCharm3.x默认快捷键 PyCharm Default Keymap 1.编辑(Editing) Ctrl + Space    基本的代码完成(类.方法.属性)Ctrl + Alt + Sp ...