`
paddy.w
  • 浏览: 505033 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Servlet介绍(4)——Filter

阅读更多
filter的意思简单的说就是过滤器,它的作用就是当用户请求一个url之前,可以预先做一些处理,当请求完url返回给用户之前还可以做一些处理(所以filter的功能十分的强大,如果想做的话可以强大到让用户,不能访问请求的url的程度。。。)

接口javax.servlet.Filter

   void init(FilterConfig filterConfig)
   可以在此方法中完成Filter需要初始化的内容,在一个filter提供服务之前肯定会先调用此方法

void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
当用户访问的url或者servlet被配置了使用此filter时,servlet/jsp容器会调用此方法,每次访问调用一次。chain参数为一个FilterChain接口的对象,可以简单的理解成chain包含了访问一个url上所有的需要调用的方法。

void destroy()
当不需要一个filter再提供服务时调用,容器会调用此方法

filter的工作模式如附件图片:

假如用户访问的一个url有两个filter的时候。
servlet容器会先调用最外层的filter(Filter1)的doFilter()方法,然后在由Filter1中调用的chain.doFilter方法将控制权返回给容器,接着容器调用第二层filter(Filter2)的doFilter方法,然后在由Filter2中调用的chain.doFilter方法将控制权返回给容器,这个时候容器才能去访问真正的需要请求的servlet和jsp,但servlet和jsp执行完毕以后,会运行Filter2中doFilter方法调用的chain.doFilter方法后剩余的代码片断,之后再运行Filter1中doFilter方法调用的chain.doFilter方法后剩余的代码片断。


Filter对应的请求方式有4种:request、forward、include、error



request:当用户直接请求一个网页时才会通过此filter,当用户通过RequestDispatcher(会再后面详细介绍该类的方法)的forward不会通过该filter

forward: 当用户通过RequestDispatcher的forward方法访问对应的url时才会通过该filter

include:当用户通过RequestDispatcher的include方法访问对应的url时才会通过该filter

error:当用户的请求通过错误处理机制的时候才会通过该filter(目前不准备详细论述)。



一个filter可以对应几种请求方式,但是如果配置时不写请求方式的话,默认方式为request。



下面先举一个例子看下filter工作的过程:



FilterFirst:




package squall.servlet.filter;



import java.io.IOException;



import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;



public class FilterFirst implements Filter

{



       public void destroy()

       {



       }



       public void doFilter(ServletRequest request, ServletResponse response,

                     FilterChain chain) throws IOException, ServletException

       {

              System.out.println("Begin First Filter!");

              chain.doFilter(request, response);

              System.out.println("After First Filter!");

       }



       public void init(FilterConfig config) throws ServletException

       {



       }



}






FilterSecond:




package squall.servlet.filter;



import java.io.IOException;



import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;



public class FilterSecond implements Filter

{



       public void destroy()

       {



       }



       public void doFilter(ServletRequest request, ServletResponse response,

                     FilterChain chain) throws IOException, ServletException

       {

              System.out.println("Begin Second Filter!");

              chain.doFilter(request, response);

              System.out.println("After Second Filter!");

       }



       public void init(FilterConfig config) throws ServletException

       {

             

       }



}






部署时修改web.xml如下:

在第一个<servlet>标签前添加:

      



  <filter>

        <filter-name>FilterFirst</filter-name>

        <filter-class>squall.servlet.filter.FilterFirst</filter-class>

    </filter>

    <filter>

        <filter-name>FilterSecond</filter-name>

        <filter-class>squall.servlet.filter.FilterSecond</filter-class>

    </filter>

   

    <filter-mapping>

        <filter-name>FilterFirst</filter-name>

              <url-pattern>/HelloServlet</url-pattern>

    </filter-mapping>

    <filter-mapping>

        <filter-name>FilterSecond</filter-name>

              <url-pattern>/HelloServlet</url-pattern>

</filter-mapping>




将filter标签放置在一起,将filter-mapping标签放在再一起,顺序根据filter-name一致。这里的filter-mapping的顺序即为:假如我们访问的一个url有两个filter时,filter的先后顺序,web.xml中filter-mapping在前面的filter先被执行。



部署完毕之后我们访问:http://127.0.0.1:8080/train/HelloServlet

可以看到tomcat管理控制台输出如下:

Begin First Filter!

Begin Second Filter!

After Second Filter!

After First Filter!



上面的例子可以看出filter工作的过程和我们上面的图片一致。



下面我们来举一个比较贴近实际的例子看一下filter的方便之处。

下面的例子用于常见的解决中文乱码的问题,我们为了防止中文乱码经常需要调用

HttpServletRequest和HttpServletResponse的setCharacterEncoding方法,底下的这个filter的例子实现了,采用filter来解决这个问题。

Filterparam.html:




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<META http-equiv="Content-Type" content="text/html; charset=GBK" />

<script type="text/javascript">...

      

      

function changeaction()

{

       var a = document.getElementsByName("filter");

       for(i = 0; i < a.length; i++)

       {

              if(a[i].checked==true)

              {

                     fm.action=a[i].value;

                     break;

              }

       }

}

</script>



        <title>filterparameter.html</title>

</head>







<body bgcolor="#FDF5E6">



<h2>Filter中文乱码示范</h2>



<form name ="fm" method="post" action="FilterShowParameter/No">

 

  <p>姓名:<input type="text" name="username" size="15" /> </p>

 

  <p>使用filter:

  <input name="filter" value="FilterShowParameter/No" type="radio" onclick="changeaction()" checked />

       不使用

  <input name="filter" value="FilterShowParameter/Yes" type="radio" onclick="changeaction()" />

       使用

  </p>

  <p>

  <input value="确认" type="submit" />

  <input value="清除" type="reset" />

  </p>

</form>





</body>

</html>




直接放在train目录下



FilterShow:






package squall.servlet.basic;



import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class FilterShow extends HttpServlet

{

       protected void doGet(HttpServletRequest req, HttpServletResponse resp)

                     throws ServletException, IOException

       {

              showParam( req,  resp);

       }



       protected void doPost(HttpServletRequest req, HttpServletResponse resp)

                     throws ServletException, IOException

       {

              showParam( req,  resp);

       }

      

       private void showParam(HttpServletRequest req, HttpServletResponse resp) throws IOException

       {

              resp.setContentType("text/html");

              PrintWriter out = resp.getWriter();

              String docType = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";



              String name = req.getParameter("username");

             

              out.println(docType + "<HTML> " + "<HEAD><TITLE> showparam"

                            + "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "

                            +"     姓名:" + name + "   </br>"

                            );



          out.println("</body></html>");

       }

}




部署时将FilterShow mapping至/FilterShowParameter/*



EncodingFilter:




package squall.servlet.filter;



import java.io.IOException;



import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;



public class EncodingFilter implements Filter

{



       public void init(FilterConfig config) throws ServletException

       {

              String str = config.getInitParameter("encoding");

              if (str != null && !"".equals(str))

                     encoding = str;

       }



       public void doFilter(ServletRequest request, ServletResponse response,

                     FilterChain chain) throws IOException, ServletException

       {

              System.out.println("encoding is " + encoding);

              if(encoding != null)

              {

                     request.setCharacterEncoding(encoding);

                     response.setCharacterEncoding(encoding);

              }

              chain.doFilter(request, response);

       }



       public void destroy()

       {



       }



       private String encoding = null;



}






EncodingFilter的功能就是将request和response setCharacterEncoding为预先定义好的encoding。getInitParameter 将在以后介绍。



EncodingFilter部署方式:

在web.xml最后一个</filter>下添加








<filter>

        <filter-name>EncodingFilter</filter-name>

        <filter-class>squall.servlet.filter.EncodingFilter</filter-class>

        <init-param>

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

               <param-value>GBK</param-value>

        </init-param>

</filter>



然后在最后一个</filter-mapping>下添加:






<filter-mapping>

        <filter-name>EncodingFilter</filter-name>

              <url-pattern>/FilterShowParameter/Yes</url-pattern>

              <dispatcher>REQUEST</dispatcher>

              <dispatcher>FORWARD</dispatcher>

    </filter-mapping>



部署完毕后访问http://127.0.0.1:8080/train/filterparam.html

输入姓名为中文以后,如果使用filter 选择为 不使用 则会看到乱码

选择使用filter后 则会看到正确的中文。



上面的例子是对REQUEST和FORWARD使用filter。

关于filter-mapping的include方式做一个简单的说明,如下:






<filter-mapping>

        <filter-name>FilterName</filter-name>

              <servlet-name>HelloServlet</servlet-name>

              <dispatcher>INCLUDE</dispatcher>

</filter-mapping>



include方式时必须将<url-pattern>修改为<servlet-name>

上面的filter-mapping的含义为:

当HelloServlet这个servlet里调用RequestDispatcher的include时,才会通过此filter。



filter的功能远远不只上面举的例子,filter还可以对servlet和jsp输出至客户端的内容进行修改,还可以用来判断是否满足一些条件,假如不满足条件就不让访问者访问相应的条件,这里就不做一一的介绍了。
分享到:
评论

相关推荐

    web服务器三大组件servlet、Filter、Listener——浅浅笔记

    Web服务器中的三大组件,即Servlet、Filter和Listener,是构建动态Web应用程序的关键元素。这些组件都是基于Java的,主要用于增强和扩展Web服务器的功能。 Servlet是Java中用于处理HTTP请求的核心组件,它是动态...

    简单的web开发——servlet案例

    - 过滤器:Servlet容器还支持过滤器(Filter),它们可以拦截请求和响应,进行预处理或后处理,如登录验证、字符编码转换等。 总之,"简单的web开发——servlet案例"为初学者提供了一个很好的起点,通过学习和实践...

    JavaWeb——Servlet.docx

    3. `javax.servlet.annotation`:包含Servlet、Filter和Listener的注解,用于元数据定义。 4. `javax.servlet.descriptor`:提供Web应用程序配置信息的编程访问。 在实现Servlet时,开发者可以选择直接实现Servlet...

    servlet基础与servlet容器模型

    本篇将深入探讨Servlet的基础知识及其运行环境——Servlet容器模型。 首先,让我们了解Servlet的基础。Servlet是一个Java类,遵循javax.servlet.Servlet接口,它允许开发者扩展服务器的功能。当用户向Web服务器发送...

    学生信息管理系统(jsp,Junit,servlet,filter,sql)

    《学生信息管理系统——基于JSP、JUnit、Servlet、Filter与SQL的实现》 学生信息管理系统是信息化教育领域中常见的应用,它旨在通过计算机技术管理大量的学生数据,提高工作效率,减少人为错误。本系统采用JavaWeb...

    Servlet——编程

    ### Servlet编程概述 ...通过以上介绍,我们可以了解到Servlet技术在Web开发中的核心地位以及其实现机制。掌握了Servlet的基本原理和技术要点,可以帮助开发者更好地构建高效、安全的Web应用程序。

    本节课Lesson_servlet增删改查_理解filter

    在本节课"Lesson_servlet增删改查_理解filter"中,我们将深入探讨Java Web开发中的核心组件——Servlet以及过滤器(Filter)的概念和应用。Servlet是Java平台上的一个标准接口,用于扩展服务器的功能,特别是在Web...

    java servlet帮助文档

    5. **Servlet容器**:讨论Servlet运行的环境——Servlet容器(如Tomcat、Jetty等),它们如何加载和管理Servlet,以及如何配置容器以满足特定需求。 6. **会话管理**:涵盖如何在Servlet中管理用户的会话,使用`...

    Servlet3.0新特性解析

    而在Servlet3.0中,我们可以通过`@WebFilter`注解来直接定义过滤器,指定其过滤的URL模式、DispatcherType等。这样,过滤器的配置就更加灵活和直观。 下面是一个使用注解声明的过滤器示例: ```java @WebFilter...

    Servlet API 中文版+英文版 chm

    4. **生命周期方法**:Servlet有三个重要的生命周期方法——`init()`, `service()`, 和 `destroy()`。`init()`在Servlet首次加载时被调用,用于初始化Servlet;`service()`根据请求类型调用对应的方法;`destroy()`...

    servlet总结(自己从网上下载的)

    - **请求转发**:在`Servlet总结02——请求转发.docx`中详细介绍了,请求转发是服务器端内部的跳转,使用`RequestDispatcher`的`forward()`方法,转发后,URL不会改变,多个资源可以共享同一个请求对象。...

    Servlet帮助文档chm版

    在Servlet的世界里,首先我们要理解Servlet的本质——它是一个Java类,由Web服务器调用以响应客户端(通常是Web浏览器)的请求。Servlet生命周期包括加载、实例化、初始化、服务、销毁几个阶段。开发者可以通过覆盖...

    listener和filter 监听器和过滤器的介绍以及简单使用(csdn)————程序.pdf

    1. **过滤器定义**:过滤器是实现了javax.servlet.Filter接口的Java类,它可以在请求到达目标资源(如Servlet、JSP)之前和之后执行操作,如权限验证、字符编码转换、日志记录等。 2. **过滤器链**:多个过滤器可以...

    Servlet 3.0jar包和source包

    在这个主题中,我们将深入探讨Servlet 3.0的主要特性和功能,以及提供的两个jar包——`javax.servlet-3.0-sources.jar`和`javax.servlet.jar`的作用。 首先,Servlet 3.0作为Servlet API的一个版本,引入了许多新...

    基于Jsp+Tomcat+Servlet+Filter的超市管理系统.zip

    【标题】:“基于Jsp+Tomcat+Servlet+Filter的超市管理系统” 这个标题揭示了一个使用经典Web开发技术栈构建的项目——一个超市管理系统。这里的关键技术包括Java Server Pages (JSP)、Apache Tomcat服务器、...

    java实现的servlet工程源码(eclipse)

    1. **Servlet生命周期**:Servlet有三个主要阶段——初始化、服务和销毁。初始化阶段通常在Servlet首次被请求时发生,服务阶段处理客户端的请求,销毁阶段在Servlet不再需要时执行。 2. **Servlet配置**:在`web....

    Servlet&JSP课后习题解答

    5. `web.xml`的作用:作为Web应用程序的核心配置文件,`web.xml`定义了Servlet、过滤器(Filter)、监听器(Listener)的配置信息,以及Web应用的上下文参数和欢迎文件列表等,是Web容器启动和管理Web应用的重要依据。...

    servlet&Jsp核心编程第二版英文版

    6. **过滤器(Filter)**:介绍如何编写和配置过滤器,以实现请求预处理、响应后处理等功能,如字符集转换、登录验证等。 7. **监听器(Listener)**:讲解如何使用各种类型的监听器,如`HttpSessionListener`,来...

    servlet3.1规范

    4. **异步处理**:Servlet 3.1增强了异步处理能力,通过`AsyncContext`接口,Servlet可以启动一个异步操作并在后台执行,从而避免阻塞线程,提高了服务器性能。 5. **依赖注入**:Servlet 3.1引入了CDI(Contexts ...

Global site tag (gtag.js) - Google Analytics