当前位置: 首页 > news >正文

Servlet之过滤器Filter详解

一、过滤器的基本工作原理

1、过滤器的基本工作原理 

过滤器的基本工作原理如图4-8示。


2、过滤器的特点 
过滤器具备有以下特点: 
(1)它是声明式的 
(2)它是动态的
(3)它是模块化的 
(4)它是可移植的 
(5)它是可重用的 
(6)它是透明的 


二、过滤器的API接口及部署信息 
1、javax.servlet.Filter接口 
(1)public void init(FilterConfig filterConfig) throws ServletException 
init()方法执行初始化操作
(2) public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws java.io.IOException,ServletException 
过滤器的业务逻辑代码在doFilter()方法内实现 
(3)public void destroy() 
在销毁一个过滤器对象之前,此方法被调用来释放init()中申请的资源,这个方法的执行,表示一个过滤器的生命期结束

2、 javax.servlet.FilterConfig接口
(1)public java.util.Enumeration getInitParameterNames() 
将初始化参数的变量名读至枚举型对象中。 
(2)public java.lang.String
                                 getInitParameter(java.lang.String name) 
读取指定变量名的初始化参数值,如果没有此参数,则返回Null值。 
(3)public ServletContext getServletContext() 
获得当前Web应用的ServletContext对象。 

3、javax.servlet. FilterChain接口 
接口中关键的方法为:
public void doFilter(ServletRequest  request,
ServletResponse response)  throws  java.io.IOException,ServletException 

4、过滤器的部署 
在WEB-INF\web.xml中部署一个过滤器的过程有:注册过滤器、映射过滤器
(1)注册过滤器 
过滤器在Web应用中注册后才会被容器加载运行。在web.xml中注册过滤器的方法如下示:

<filter>
      <filter-name>my1</filter-name>
      <filter-class>com.abc.mis.Filter1</filter-class>
      <init-param>
        <param-name>password</param-name>
        <param-value>123</param-value>
      </init-param>
</filter>

容器为一个<filter></filter>元素创建一个过滤器实例,同一个过滤器类可以生成多个实例,此时只需要部署多个<filter></filter>元素,例如:
 <filter>
      <filter-name>my1</filter-name>
      <filter-class>com.abc.mis.Filter1</filter-class>
      <init-param>
        <param-name>password</param-name>
        <param-value>123</param-value>
      </init-param>
</filter>

(2)映射过滤器 
过滤器映射就是定义此过滤器的激活条件,一般是通过目标资源的URI模式和请求的类型来定义。URI中可以使用通配符“*”来表达请求的URI模式。过滤器映射的基本方法如下示: 
<filter-mapping>
      <filter-name>my1</filter-name>
      <url-pattern>/test/*</url-pattern>
      <dispatcher>REQUEST</dispatcher>
      <dispatcher>FORWARD</dispatcher>
</filter-mapping>


三、第一个过滤器程序
过滤器的基本编程过程是: 
第一步:编辑与编译过滤器程序,把编译后得到的包文件夹及*.class类发布到ROOT\WEB-INF\classes文件夹下。 
第二步:编辑WEB-INF\web.xml文件,添加过滤器的部署信息。 
第三步:重启Tomcat或重载Web应用,使过滤器生效。 

【例】:定义三个过滤器:
如果用户访问“/test”下的资源时,过滤器1被激活,它判断用户是否已经登录,如果没有登录则中断请求,并返回404错误信息,如果已经登录则将请求转发给下一个过滤器。
定义过滤器2,当请求“/*”资源并且请求是来自客户端时它才被激活,显示提示信息,然后把请求转发给下一个过滤器。
过滤器3的功能同过滤器2,但它的请求类型为REQUEST或FORWARD。

操作步骤如下:
(1) 启动JC4,新建一个类“Filter1”,在代码编辑窗口中输入如下的代码: 

<span style="font-family:SimSun;"><span style="font-family:FangSong_GB2312;font-size:14px;">package my;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Filter1 implements Filter {

  private FilterConfig config = null;

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

  public void destroy() {
    config = null;
  }

  public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) throws IOException, ServletException 
 {
    response.setCharacterEncoding("GB2312");
    PrintWriter out=response.getWriter();
	HttpSession session=((HttpServletRequest)request).getSession();
	
     System.out.println("过滤器1工作,请求转下一个处理..");
     out.print("<br>请求到达目标资源前过滤器2添加的信息<br>");
     
     String loginStatus=(String)session.getAttribute("loginName");
     if(loginStatus==null)
       {
     	    out.print("<br>你没有登陆,无房访问资源!<br>");
     	    return;
     	  }
     else 
         chain.doFilter(request, response);	 
    
    System.out.println("目标资源输出信息返回到过滤器1...");
    out.print("<br>目标资源输出信息返回时过滤器2添加的信息<br>"); 
    
    
  }
}</span></span>

(2)编译Filter1程序,成功后,Filter1.class文件会被JC4自动存放至c:\tomcat\webapps\ROOT\WEB-INF\classes文件夹下,用“我的电脑”查看并核实。 
(3)启动JC4,新建一个类“Filter2”,在代码编辑窗口中输入如下的代码:

<span style="font-family:SimSun;"><span style="font-family:FangSong_GB2312;font-size:14px;">package my;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Filter2 implements Filter {

  private FilterConfig config = null;

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

  public void destroy() {
    config = null;
  }

  public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) throws IOException, ServletException 
 {
        response.setCharacterEncoding("GB2312");
        PrintWriter out=response.getWriter();
        
        System.out.println("过滤器2工作,请求转下一个处理..");
        out.print("<br>请求到达目标资源前过滤器2添加的信息<br>");
        
        chain.doFilter(request, response);	
        
        </span><pre name="code" class="java"><span style="font-family:FangSong_GB2312;font-size:14px;"> <span style="white-space:pre">	</span>System.out.println("目标资源输出信息返回到过滤器2...");
        out.print("<br>目标资源输出信息返回时过滤器2添加的信息<br>"); </span></span>
}}

 

(4)编译Filter2程序。 (5)启动JC4,新建一个类 “Filter3”,在代码编辑窗口中输入如下的代码:

<span style="font-family:SimSun;"><span style="font-family:FangSong_GB2312;font-size:14px;">package my;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Filter3 implements Filter {

  private FilterConfig config = null;

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

  public void destroy() {
    config = null;
  }

  public void doFilter(ServletRequest request, ServletResponse response,
                     FilterChain chain) throws IOException, ServletException 
 {
       </span><pre name="code" class="java"><span style="font-family:FangSong_GB2312;font-size:14px;"><span style="white-space:pre">	</span>System.out.println("过滤器3工作,请求转下一个处理..");
        out.print("<br>请求到达目标资源前过滤器3添加的信息<br>");
        
        chain.doFilter(request, response);	
        
        </span><pre name="code" class="java"><span style="font-family:FangSong_GB2312;font-size:14px;"> <span>	</span>System.out.println("目标资源输出信息返回到过滤器3...");
        out.print("<br>目标资源输出信息返回时过滤器3添加的信息<br>"); </span></span>

 
}} 
 
(6)编译Filter3程序。 
(7)部署以上三个过滤器,得到一个过滤器链为:过滤器3→过滤器1→过滤器2。
编辑WEB-INF\web.xml文件,添加如下的部署信息:




(8)定义实验用JSP资源。启动DW8,完成以下任务: 
新建exam406.jsp,在设计视图中输入提示文字“当前是/exam406.jsp 资源”。 
新建exam407.jsp,在代码视图中输入以下代码: 
<body>
  <%
     session.setAttribute("loginName","tom");
out.print("成功登录,可以访问/test下的资源了!");
  %>
</body> 

新建exam408.jsp,在设计视图中,将站点中的“ROOT\tomcat.gif”图片插入文档中。 
在站点根文件夹下新建一个/test下级文件夹。
在/test文件夹下建立一个index.jsp文件,在设计视图中输入提示文字“/test的首页”。 
新建exam409.jsp,在代码视图中输入以下代码: 

<body>
<%
    RequestDispatcher go=application.getRequestDispatcher("/exam406.jsp");
go.forward(request,response);
%>
</body> 
(9)启动Tomcat,自行完成测试即可。



相关文章:

  • select into from和insert into select from两种表复制语句区别
  • SendRedirect和forward的区别
  • Vim常用操作和快捷键技巧总结
  • 用JDBC编程的运行时错误及其解决大全
  • Myeclipse10.7连接SQL Server数据库技术
  • C++构造函数虚函数例题
  • Servlet过滤字符串的HTML特殊字符
  • PHP中print_r、var_export、var_dump区别
  • Jsp/Servlet根据请求参数自动填充Java对象:表单Bean
  • ORACLE 如何定位消耗资源的SQL
  • Servlet/Jsp实现当参数确实或缺失重新显示输入表单
  • Servlet/Jsp实现发送压缩Web页面 Gzip技术
  • Java内存区域与内存溢出
  • 如何删除鼠标右键菜单里的打开按钮
  • Struts2的s:date标签使用详解[转]
  • @jsonView过滤属性
  • gulp 教程
  • laravel 用artisan创建自己的模板
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • React-flux杂记
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Zsh 开发指南(第十四篇 文件读写)
  • 从零开始学习部署
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 如何在 Tornado 中实现 Middleware
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 算法-图和图算法
  • 智能合约Solidity教程-事件和日志(一)
  • Java总结 - String - 这篇请使劲喷我
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • $$$$GB2312-80区位编码表$$$$
  • (12)目标检测_SSD基于pytorch搭建代码
  • (2015)JS ES6 必知的十个 特性
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (C语言)字符分类函数
  • (k8s中)docker netty OOM问题记录
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (MATLAB)第五章-矩阵运算
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (排序详解之 堆排序)
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Reactor简单使用教程
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 使用反射注册事件
  • .net6+aspose.words导出word并转pdf
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET下的多线程编程—1-线程机制概述
  • .Net下的签名与混淆
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .py文件应该怎样打开?
  • .sh