Servlet的Filter的使用

    Filter可认为是Servlet的“加强版”,主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成相应,这一点与Servlet相同,但实际上很少会这样使用。使用Filter的完整流程是:Filter对用户的请求进行预处理,接着将请求交给Servlet进行处理并响应生成,最后Filter在对服务器响应进行后处理。

1. Filter有如下几个用处:

  • 在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest
  • 根据需要,检查HttpServletRequest,也可以修改HttpServletRequest的头和数据
  • 在HttpServletResponse到达客户端之前,拦截HttpServletResponse
  • 根据需要,检查HttpServletResponse,也可以修改HttpServletResponse的头和数据

2. Filter有如下几个种类:

  • 用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户的非法请求,通常用于权限管理。
  • 日志Filter:详细记录某些特殊的用户请求
  • 负责解码的Filter:包括对非标准编码的请求解码
  • 能改变XML内容的XSLT Filter等

3. 创建一个Filter只需两个步骤:

  1). 创建Filter处理类 2). 在web.xml文件中配置Filter

3.1 创建Filter处理类

  创建Filter必须实现javax.servlet.Filter接口,在该接口中定义了如下三个方法:

  • void init(FilterConfig config):用于完成Filter的初始化
  • void destroy():用于Filter销毁钱,完成某些资源的回收
  • void doFilter(ServletRequest request, ServletResponse response, FilterChain chain):实现过滤功能,该方法就是对每个请求及响应增加的额外处理

  下面是一个日志Filter,它负责拦截所有的用户请求,并将请求的信息记录在日志中。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

@WebFilter(filterName="log", urlPatterns={"/*"}, initParams={ //这里使用注解的方式配置Filter

  @WebInitParam(name="encoding" value="UTF-8"),

  @WebInitParam(name="loginPage" value="/login.jsp")

}) 

public class LogFilter implements Filter {

  private FilterConfig config;//FilterConfig可用于访问Filter的配置信息

  public void init(FilterConfig config) { this.config = config; }

  public void destroy(){this.config = null;}

  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException{

    //下面的代码用于对用户请求执行预处理

    ServletContext context = this.config.getServletContext();//获取ServletContext对象,用于记录日志

    long before = System.currentTimeMillis();

    System.out.println("开始过滤...");

    HttpServletRequest request = (HttpServletRequest)req;

    System.out.println("已经拦截到用户的请求地址:" + request.getServletPath());

    chain.doFilter(req, resp);//Filter只是链式处理,请求依然放行到目的地址

  

    //下面的代码用于对服务器响应执行后处理

    long after = System.currentTimeMillis();

    System.out.println("过滤结束");

    System.out.println("请求被定位到:" + request.getRequestURI() + " 耗时:" + (after - before));//这里只是输出提示信息

  }

}

  上面的代码实现了doFilter()方法,实现该方法可以实现对用户请求的预处理,也可实现对服务器响应的后处理,它们的分界线为是否调用了chain.doFilter()方法,在这之前的是对用户请求的预处理,在这之后的,是对服务器响应的后处理。当Filter对请求过滤后,依然将请求发送到目的地址。如果需要检查权限,可以在Filter中根据用户请求的HttpSession,判断用户权限是否足够。如果权限不足,直接调用重定向即可,无需调用chain.doFilter()方法。

3.2 配置Filter

  Filter在web.xml中的配置和Servlet在web.xml中的配置很相似,区别在于:一个Servlet通常只配置一个URL,而Filter可以同时拦截多个请求的URL,因此在配置Filter的urlPatterns时,通常会使用模式字符串,使得Filter可以拦截多个请求。和Servlet相似的是,配置Filter同样有两种方式:1). 在Filter类中通过注解进行配置  2). 在web.xml文件中进行配置

  @WebFilter支持的常用属性介绍:

  • asyncSupported:指定该Filter是否支持异步操作模式
  • dispatcherTypes:指定该Filter仅对那种dispatcher模式的请求进行过滤。该属性支持ASYNC, ERROR, FORWARD, INCLUDE, REQUEST这5个值的任意组合,默认值为同时过滤这5中模式的请求
  • displayName:指定该Filter的显示名
  • filterName:指定该Filter的名称
  • initParams:用于为该Filter配置参数
  • servletNames:该属性可以指定多个Servlet名称,用于指定该Filter仅对这些Servlet进行过滤
  • urlPatterns/value:这两个属性的作用完全相同,用于指定该Filter所拦截的URL

  下面是一个在web.xml中配置Filter的例子:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<filter>

  <filter-name>log</filter-name<!-- 此属性相当于@WebFilter中的filterName属性 -->

  <filter-class>com.abc.LogFilter</filter-class>  <!-- Filter的实现类 -->

  <init-param>

    <param-name>encoding</param-name>

    <param-value>UTF-8</param-value>

  </init-param>

  <init-param>

    <param-name>loginPage</param-name>

    <param-value>/login.jsp</param-value>

  </init-param>

</filter>

<filter-mapping>

  <filter-name>log</filter-name>

  <url-pattern>/*</url-pattern<!-- 负责拦截所有的URL,相当于@WebFilter中的urlPatterns属性 -->

</filter-mapping>

时间: 2024-11-27 02:28:15

Servlet的Filter的使用的相关文章

Servlet和Filter的url匹配url-pattern

Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜. 估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天遇到一个问题,上网查了servlet的规范才发现,servlet和filter中的url-pattern还是有一些文章在里面的,总结了一些东西,放出来供大家参考,以免遇到问题又要浪费时间. 一.servlet容器对url的匹配过程: 当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,

Servlet、Filter

  加载顺序是:context-param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的.       下面从几个方面阐述一下题目中四个概念的区别与联系:1.概念2.生命周期3.职责4.执行过程 一.概念:1.servlet:servlet是一种运行服务器端的Java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层.2.f

深入Jetty源码之Servlet框架及实现(Servlet、Filter、Registration)

概述 Servlet是Server Applet的缩写,即在服务器端运行的小程序,而Servlet框架则是对HTTP服务器(Servlet Container)和用户小程序中间层的标准化和抽象.这一层抽象隔离了HTTP服务器的实现细节,而Servlet规范定义了各个类的行为,从而保证了这些"服务器端运行的小程序"对服务器实现的无关性(即提升了其可移植性).在Servlet规范有以下几个核心类(接口):ServletContext:定义了一些可以和Servlet Container交互的

JSP中的Servlet及Filter

asp.net中,如果开发人员想自己处理http请求响应,可以利用HttpHandler来满足这一要求:类似的,如果要拦截所有http请求,可以使用HttpMoudle.java的web开发中,也有类似的处理机制,与HttpHandler应对的是HttpServlet,与HttpModule对应的则是Filter. 一.HttpServlet 先看一个简单的示例: 1 package com.cnblogs.yjmyzz.servlet; 2 3 import java.io.IOExcepti

Servlet和Filter之间的区别与联系_java

filter是一个可以复用的代码片段,可以用来转换HTTP请求.响应和头信息.Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应. 最近使用插装的时候,改用cookie对计算机进行识别,加入了过滤,仔细研究了一下servlet和filter,区别主要是: 过滤器的生命周期一般都要经过下面三个阶段: servlet的特点是: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Con

Java servlet、filter、listener、interceptor之间的区别和联系_java

servlet.filter.listener.interceptor之间的区别和联系 一.概念 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层. 2.filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求.响应和头信息.Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应. 3.listener:

新人servlet和filter编程出问题求大神解救

问题描述 这个是写得servlet用于登陆成功后的显示这个是拦截器密码错了就直接系统控制台输出youarewrong登陆界面JSP的还有配置文件问题有2个.1个是登陆界面中文的显示问题,另外一个是拦截器为什么只有一半的功能实现了.账号密码输入正确以后为什么页面是跳出一个下载界面文件类型:未知.百思不得其解.求各位大大帮我看看...谢谢 解决方案 解决方案二:<filter-mappping>改这样,<filter-mappping><filter-name>testfi

web.xml 中的listener、 filter、servlet 加载顺序及其详解

在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰.         首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> filter -> servlet         同时还存在着这样一种配置节:context-pa

servlet/filter/listener/interceptor区别与联系

下面从几个方面阐述一下题目中四个概念的区别与联系:         1.概念          2.生命周期          3.职责          4.执行过程                   一.概念:          1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层.          2.filter:filter是一个可以复用的代码片段,可以用来转换HTT