`
paddy.w
  • 浏览: 498260 次
  • 性别: 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、Listene——浅浅笔记

    详解Servlet之过滤器(Filter)

    本篇文章主要介绍了Servlet——过滤器(Filter),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    JSP2.0技术手册pdf(带示例源码).zip

    本书图文并茂,以丰富的实例为引导,全面介绍了主流的 Java Web 开发技术—— JSP 2.0,重点介绍Java在展示层的两项重要技术:Java Servlet与JavaServer Pages。 它们是最重要的 Java 核心技术。对这两项技术的深入...

    JavaWeb综合项目——快递e栈

    javaweb综合练习,涉及知识点:html、css、js、Jquery、bootstrap、layui、layer、ajax、mysql、tomcat、servlet、filter、listener、jsp、公有云服务器。

    Google Android SDK开发范例大全(完整版)

    6.16 开机程序设计——receiver与intent-filter协同作业 6.17 双向短信常驻服务——Service与receiver实例 第7章 娱乐多媒体 7.1 访问Drawable资源的宽高——ContextMenu与Bitmap的应用 7.2 绘制几何图形——使用...

    javaWeb知识点总结—— 关乎JSP、JSTL、Filter、Listener的知识(含详细思维导图)

    javaWeb知识点 JSP 概念 ...在最早期是没有JSP的,那么后端开发人员想要展示一个网页,就是在Servlet中 拼接html. 于是就有了JSP, 但是JSP不是...import: java.lang.:snowflake: 、javax.servlet.:snowflake:、javax.ser

    web项目-尘歌壶摆设购买系统

    尘歌壶摆设购买系统(Serenitea-Pot-Furnishing),采用原生Servlet + JSP完成开发,用到了HTML+CSS+JS, JSON, Tomcat, Servlet, JSP, EL+JSTL, Session, Filter, JQuery, Ajax等内容。 PS1: 项目十大功能————...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境、JSP语法、JSP内置对象、Java Bean技术、Servlet技术、EL与JSTL标签库、数据库应用开发、初识Struts2基础、揭密Struts2高级技术、Hib锄劬e...

    java web 开发详解

    Java 的 Web框架虽然各不相同,但基本也都是遵循特定的路数的:使用Servlet或者Filter拦截请求,使用MVC的思想设计架构,使用约定,XML或 Annotation实现配置,运用Java面向对象的特点,面向抽象实现请求和响应的...

    Java Web程序设计教程

    1.2.2丰富的框架技术 4 1.2.3xml、css的应用 4 1.2.4使用javascript与ajax提升用户体验 7 1.3多种集成开发环境 9 1.3.1集成开发环境简介 9 1.3.2web应用服务器说明 11 本章小结 14 课后练习 14 第2章 ...

    java面试题库2021.pdf

    ①Servlet、 标签的作用 ②redis ③MVC 和 DAO ④JSTL、 DisplayTag 等常见标签库的用法 3、 Web 编程原理 ① HTTP 协议 ②请求/相应架构原理 ③web 容器 四、 JDBC 编程 1、 SQL 基础 2、 JDBC 基础 ①数据库 ②...

    JavaWeb每日总结思维导图

    内容包括:MySQL、MySQL约束&多表、MySQL多表&事务、JDBC、数据库连接池、HTML、CSS、JS基础&高级、BootStrap、XML、Tomcat、Servlet&HTTP&Request、Response、Cookie&Session、JSP&EL&JSTL、Filter&Listener、...

    电子商城系统设计实习报告.doc

    Java的W eb框架虽然各不相同,但基本也都是遵循特定的路数的:使用Servlet或者Filter拦截请 求,使用MVC的思想设计架构,使用约定,XML或 Annotation实现配置,运用Java面向对象的特点,面向抽象实现请求和响应的...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    7.3.3 注册Servlet、Filter、Listener 186 7.4 Tomcat 配置 187 7.4.1 配置Tomcat 187 7.4.2 代码配置Tomcat 188 7.4.3 替换Tomcat 190 7.4.4 SSL 配置 191 7.5 Favicon 配置 196 7.5.1 默认的Favicon 196 7.5.2 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    7.3.3 注册Servlet、Filter、Listener 186 7.4 Tomcat 配置 187 7.4.1 配置Tomcat 187 7.4.2 代码配置Tomcat 188 7.4.3 替换Tomcat 190 7.4.4 SSL 配置 191 7.5 Favicon 配置 196 7.5.1 默认的Favicon 196 7.5.2 ...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    7.3.3 注册Servlet、Filter、Listener 186 7.4 Tomcat 配置 187 7.4.1 配置Tomcat 187 7.4.2 代码配置Tomcat 188 7.4.3 替换Tomcat 190 7.4.4 SSL 配置 191 7.5 Favicon 配置 196 7.5.1 默认的Favicon 196 7.5.2 ...

    Python编程入门经典

    9.1 lambda和filter:简单匿名 函数 131 9.2 Map:短路循环 132 9.3 在列表中做出决策—— 列表解析 133 9.4 为循环生成迭代器 133 9.5 使用字典的特殊字符串 替换 135 9.6 重要模块 137 9.6.1 getopt——从命令行中...

    Java旅游项目

    中国旅游网项目——三层架构 目录 1 技术选型 2 数据库 3 注册功能 技术选型 1.1 Web层 a) Servlet:前端控制器 b) html:视图。 这个项目是网站项目,要求面向普通客户,需要响应速度快,因此不采用jsp。当做后端的...

    Spring Security 中文教程.pdf

    7.4. 使用其他过滤器 —— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...

    Spring Security-3.0.1中文官方文档(翻译版)

    7.4. 使用其他过滤器—— 基于框架 8. 核心安全过滤器 8.1. FilterSecurityInterceptor 8.2. ExceptionTranslationFilter 8.2.1. AuthenticationEntryPoint 8.2.2. AccessDeniedHandler 8.3. ...

Global site tag (gtag.js) - Google Analytics