Filter(过滤器)

Filter入门


什么是Filter


Filter被称作过滤器或者拦截器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能。





当浏览器访问服务器中的目标资源时,会被Filter拦截,在Filter中进行预处理操作,然后再将请求转发给目标资源。当服务器接收到这个请求后会对其进行响应,在服务器处理响应的过程中,也需要先将响应结果发送给拦截器,在拦截器中对响应结果进行处理后,才会发送给客户端。





常用实例:自动登录,解决全站乱码,屏蔽非法文字,进行响应数据压缩等等

Filter过滤器就是一个实现了javax.servlet.Filter接口的类,

在javax.servlet.Filter接口中定义了三个方法

        init(FilterConfig filterConfig)

    doFilter(ServletRequest request, ServletResponse response,FilterChain chain)

    destroy()

Filter映射

Filter拦截的资源需要在web.xml文件中进行配置,即Filter映射。

Filter的映射方式可分为两种

使用通配符“*”来实现让过滤器拦截所有的请求访问





<filter-mapping>元素中有一个特殊的子元素<dispatcher>,该元素用于指定过滤器所拦截的资源被Servlet容器调用的方式





<dispatcher>元素的值共有四个:REQUEST、INCLUDE、FORWARD、ERROR。

Filter链

在一个Web应用程序中可以注册多个Filter程序,每个Filter程序都可以针对某一个URL进行拦截。如果多个Filter程序都对同一个URL进行拦截,那么这些Filter就会组成一个Filter链(也叫过滤器链)。

Filter链用FilterChain对象来表示,FilterChain对象中有一个doFilter()方法,该方法作用就是让Filter链上的当前过滤器放行,请求进入下一个Filter

FilterConfig接口


为了获取Filter程序在web.xml文件中的配置信息,Servlet API提供了一个FilterConfig接口,该接口封装了Filter程序在web.xml中的所有注册信息,并且提供了一系列获取这些配置信息的方法。





方法

String getFilterName ()getFilterName()方法用于返回在web.xml文件中为Filter所设置的名称,也就是返回<filter-name>元素的设置值。

ServletContext getServletContext()getServletContext()方法用于返回FilterConfig对象中所包装的ServletContext对象的引用。

String getInitParameter(String name)getInitParameter(String name)方法用于返回在web.xml文件中为Filter所设置的某个名称的初始化参数值,如果指定名称的初始化参数不存在,则返回null。

Enumeration getInitParameterNames()getInitParameterNames()方法用于返回一个Enumeration集合对象,该集合对象中包含在web.xml文件中为当前Filter设置的所有初始化参数的名称。

生命周期


1、实例化(new)

Web 容器启动时,即会根据 web.xml 中声明的 filter 顺序依次实例化这些 filter

2、初始化





1、实例化和初始化的操作只会在容器启动时执行,而且只会执行一次。 

2、 Web 容器调用 init(FilterConfig) 来初始化过滤器。

3、容器在调用该方法时,向过滤器传递 FilterConfig 对象,

4、利用 FilterConfig 对象可以得到 ServletContext 对象,以及在 web.xml 中配置的过滤器的初始化参数

5、在这个init(FilterConfig)方法中,可以抛出 ServletException 异常,通知容器该过滤器不能正常工作。此时的 Web 容器启动失败,整个应用程序不能够被访问

3、过滤

每次访问被拦截目标资源,过滤器中的doFilter的方法就会执行

4、销毁

当服务器关闭(或应用卸载)的时候,服务器就会销毁Filter对象.

应用案例--Filter实现用户自动登录


案例分析


1、登录的功能的基础上实现的自动登录.

2、在登录的页面中勾选自动登录的复选框.点击提交.

3、在提交的Servlet中,在登录成功的地方记住用户名和密码.

4、在下次访问首页的时候带着Cookie过来.

5、编写一个过滤器:

1、判断用户是否已经登录了,如果已登陆执行第7步

2、如果未登录获得Cookies的信息

3、查找指定的名称的Cookie.

4、拿到Cookie以后获得用户名和密码

5、调用业务层,在去数据库进行查询

6、能查询到,将用户的信息存入到session,

7、放行

案例实现提要


1、创建项目,创建数据库、表

2、导入jar、页面资源、工具类

3、编写LoginServlet、service、dao、javaBean等完成登陆功能

4、编写过滤器

1、判断用户是否已经登陆如果已登陆执行第5步

2、如果没有登陆获得相应的cookie,从cookie中获得用户信息

3、调用service层的服务完成登陆

4、将用户信息保存到session作用域中

5、放行

Filter高级应用

什么是包装类


Filter过滤器可以获取到代表用户请求和响应的request、response对象。可是如果想对request和response对象中的任何信息进行修改,则需要通过包装类来实现。

在Servlet API中,提供了HttpServletRequestWrapper和HttpServletResponseWrapper两个类,它们分别是request和response对象的包装类。

装饰设计模式


HttpServletRequestWrapper和HttpServletResponseWrapper都采用了装饰设计模式。所谓装饰设计模式,指的是通过包装类的方式,动态增强某个类的功能。





特点

包装类要和被包装对象实现同样的接口

包装类持有一个被包装对象

包装类在实现接口的过程中,对于不需要包装的方法原封不动地调用被包装对象的方法来实现,对于需要包装的方法自己实现。

Filter实现统一全站编码


在Filter中对获取到的请求和响应消息进行编码,从而统一全站的编码方式。

Filter实现动态页面静态化


在实际开发中,有时为了提高程序性能、减轻数据库访问压力以及搜索引擎的优化,可以使用Filter实现动态页面静态化。

当客户端首次访问页面时,Filter会自定义response输出缓存HTML源码。当客户端第二次访问页面时,就会直接访问静态页面,这样避免访问数据库。

核心API


Filter


init(FilterConfig)

doFilter(ServletRequest, ServletResponse, FilterChain)

destroy()

FilterConfig


getServletContext()

getInitParameter(String)

getInitParameterNames()

FilterChain


doFilter(ServletRequest, ServletResponse, FilterChain)

配置


@WebFilter


urlPatterns

dispatcherTypes

    REQUEST

    FORWARD

    INCLUDE

    ASYNC

    ERROR

asyncSupported

web.xml


<filter> -> <filter-name> / <filter-class>

<filter-mapping> -> <filter-name> / <url-pattern> /  <servlet-name> / <dispatcher>

案例:全局解决中文乱码问题


1、案例介绍

1、在之前编写的servlet都出现了,那就是编码处理,且之前的程序GET请求需要单独处理

2、在实际开发中,需要统一处理编码

3、本案例将以上两个问题使用过滤器统一解决。也就是在servlet前后执行特定功能

案例使用到的相关技术

装饰者模式

1、作用

设计模式:专门为解决某一类问题,而编写的固定格式的代码。

2、结构

装饰者固定结构:接口A,已知实现类C,需要装饰者创建代理类B

1、创建类B,并实现接口A

2、提供类B的构造方法,参数类型为A,用于接收A接口的其他实现类(C)

3、给类B添加类型为A成员变量,用于存放A接口的其他实现类

4、增强需要的方法

5、实现不需要增强的方法,方法体重调用成员变量存放的其他实现类对应的方法

2、案例分析

1、post方式的乱码处理

1、在filter中设置一下request.setCharacterEncoding("UTF-8");

2、放行

2、get方式的乱码处理

1、在过滤器放行之前通装饰者设计模式方法对HttpServletRequest进行增强

2、放行:chain.dofilter(proxyrequest,response),参数中的请求对象为增强后的request对象。

3、案例实现

1、在原来项目完成的基础上,创建过滤器

2、设置服务解析post请求数据的编码集

request.setCharacterEncoding("UTF-8");





3、使用装饰者模式包装HttpServletRequest

1、在装饰类中判断请求方式是post还是get





2、如果是get提交,进行乱码处理

1、String arg=request.getParameter(参数名);

2、arg=new String(art.getBytes("ISO-8859-1"),"UTF-8")





3、如果是post无需处理

4、将乱码处理后的结果返回

Java精选笔记_Filter(过滤器)的更多相关文章

  1. [Java] JSP笔记 - Filter 过滤器

    一.什么是Web过滤器 Servlet API 很久以前就已成为企业应用开发的基石,而 Servlet 过滤器则是对 J2EE 家族的相对较新的补充. Servlet 过滤器是可插入的 Web 组件, ...

  2. Java精选笔记_JSTL(JSP标准标签库)

    JSTL(JSP标准标签库) JSTL入门 JavaServer Pages Standard Tag Library:JSP标准标签库 在JSP中可以通过Java代码来获取信息,但是过多的Java代 ...

  3. Java精选笔记_Servlet技术

    Servlet技术 Servlet开发入门 Servlet接口 针对Servlet技术的开发,SUN公司提供了一系列接口和类,其中最重要的是javax.servlet.Servlet接口. Servl ...

  4. Java精选笔记_IO流【File(文件)类、遍历目录下的文件、删除文件及目录】

    File(文件)类 File类用于封装一个路径,该路径可以是从系统盘符开始的绝对路径,也可以是相对于当前目录而言的相对路径 File类内部封装的路径可以指向一个文件,也可以指向一个目录,在使用File ...

  5. Java精选笔记_IO流(字节流、InputStream、OutputStream、字节文件、缓冲区输入输出流)

    字节流 操作图片数据就要用到字节流. 字符流使用的是字符数组char[],字节流使用的是字节数组byte[]. 字节流读写文件 针对文件的读写,JDK专门提供了两个类,分别是FileInputStre ...

  6. Java精选笔记_国际化

    国际化 什么是国际化 指软件在开发时就应该具备支持多种语言和地区的功能,当应对不同国家和地区的用户访问,针对不同国家和地区的用户,提供相应的.符合来访者阅读习惯的页面和数据. 由于国际化interna ...

  7. Java精选笔记_自定义标签

    自定义标签 自定义标签入门 什么是自定义标签 自定义标签可以有效地将HTML代码与Java代码分离,从而使不懂Java编程的HTML设计人员也可以编写出功能强大的JSP页面 JSP规范中定义了多个用于 ...

  8. Java精选笔记_EL表达式

    EL表达式 初始EL EL是一种可以简化JSP页面的表达式,EL表达式的语法非常简单都是以"${"符号开始,以"}"符号结束的 EL表达式是一种简单的数据&qu ...

  9. Java精选笔记_文件上传与下载

    文件上传与下载 如何实现文件上传 在Web应用中,由于大多数文件的上传都是通过表单的形式提交给服务器的,因此,要想在程序中实现文件上传的功能,首先得创建一个用于提交上传文件的表单页面. 为了使Serv ...

随机推荐

  1. CAsyncSocket编程 MFC

    许多时候我们实现网络编程使用的是winsock api函数,虽然这些函数使用起来也很方便,很灵活,但是VC++的MFC类库中提供了CAsyncSocket这样一个套接字类,用它来实现socket编程会 ...

  2. URLConnection格式与用法

    private void getdialog() { final EditText et = new EditText(this); final String workid = this.workid ...

  3. Android——控件AutoCompleteTextView 自动提示

    Android:控件AutoCompleteTextView 自动提示 在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,这种效果在Android中是用AutoCompleteTextV ...

  4. BusyBox inittab配置

    inittab第一行指定初始化脚本,开启所有应用程序,必须有. ::sysinit:/etc/init.d/rcS 在第一行执行完后,执行剩余行命令,此终端要接受命令交互需开启sh. ::askfir ...

  5. Python高级编程之生成器(Generator)与coroutine(四):一个简单的多任务系统

    啊,终于要把这一个系列写完整了,好高兴啊 在前面的三篇文章中介绍了Python的Python的Generator和coroutine(协程)相关的编程技术,接下来这篇文章会用Python的corout ...

  6. drupal 网址合集

    Drupal7上传图片和文件重命名 http://drupalchina.cn/node/2168 Drupal 7 导入中文超时错误解决方法http://drupalchina.cn/node/17 ...

  7. java- ★学习资源★

    何静媛: http://blog.csdn.net/hejingyuan6/article/category/2367993 孤傲苍狼-java基础总结: http://www.cnblogs.com ...

  8. java- Servlet-session

    Servlet 相关:http://blog.csdn.net/ggGavin/article/category/2134213 Servlet——Session(1)之基础知识 Servlet——S ...

  9. R语言中字符串的拼接操作

    在R语言中 paste 是一个很有用的字符串处理函数,可以连接不同类型的变量及常量. 函数paste的一般使用格式为: paste(..., sep = " ", collapse ...

  10. Jquery实现仿腾讯微薄的广播发表

    前言: 由于这几天在学习Jquery的一些知识,比以前的感觉就是Jquery太强大了,很多很简单的功能以前在JavaScript要写几十行的代码而在Jquery中只用几行代码就搞定了,所以我决定好好学 ...