Java Web学习(34):Filter学习(一)

什么是过滤器

生活中的过滤器场景:

什么是Web过滤器

Web过滤器过滤用户请求,但是不处理结果。

过滤器包括:过滤源,过滤规则和过滤结果。

过滤器的概念

过滤器是一个服务器端的组件,它可以截取客户端的请求与响应信息,并对这些信息过滤。

过滤器的工作原理

假设我们访问Web资源时:

1)没有过滤器的情况下:

2)存在过滤器的情况下:

过滤器的工作原理:

过滤器拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。

过滤器只能针对用户的请求进行服务器端跳转,不直接返回数据,因为过滤器不是一个标准的servlet页面。

过滤器是在Java Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和修改。   

过滤器本身并不产生请求和响应对象,它只能提供过滤作用。过滤器能够在Servlet被调用之前检查Request

对象,修改Request Header和Request内容;在Servlet被调用之后检查Response对象,修改Response Header和

Response内容。

过滤器负责过滤的Web组件可以是Servlet、JSP或者HTML文件。

过滤器的作用

1过滤器会在一组资源的前面执行;

2过滤器可以让请求得到目标资源,也可以不让请求达到;

3过滤器有拦截请求的能力

过滤器的生命周期

过滤器的生命周期包含:

实例化——web.xml或注解

初始化——init()

过滤——doFilter()

销毁——destroy()

Filter的三个重要的方法是:

init()方法

init()方法是过滤器的初始化方法,Web容器创建过滤器实例后将调用这个方法,这个方法中可以读取web.xml文

件中过滤器的参数。

doFilter()方法

doFilter()方法完成实际的过滤操作,这个地方发是过滤器的核心方法,当用户请求访问与过滤器关联的URL时,

Web容器将先调用过滤器的doFilter()方法。FilterChain参数可以调用chain.doFilter()方法,将请求传给下一个过滤

器(或目标资源),或利用转发,重定向将请求转发到其他资源。

destroy()方法

destroy()方法是Web容器在销毁过滤器实例前调用的,在这个方法中可以释放过滤器占用的资源,大多数情况用

不到。

关于web.xml配置

过滤器是否能改变用户请求的Web资源?也就是能否改变用户请求的路径?可以

过滤器能否直接返回数据,能不能直接处理用户请求?不可以

使用注解制作第一个过滤器

过滤器如何编写:

1写一个类实现Filter接口

2在web.xml中进行配置或者使用注解。

代码实现

FirstFilter.java源代码:

package com.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;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class FirstFilter
 */
@WebFilter(filterName="FirstFilter",urlPatterns={"/index.jsp"})
public class FirstFilter implements Filter {

    /**
     * Default constructor. 
     */
    public FirstFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("destroy------FirstFilter");
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("start------FirstFilter");
		// pass the request along the filter chain
		chain.doFilter(request, response);
		System.out.println("end------FirstFilter");
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("init------FirstFilter");
	}

}

index.jsp页面代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
     <h1>过滤器</h1>
     <hr>
     <%
           System.out.println("处理过程完成");
      %>
</body>
</html>

运行结果:

destroy()方法在服务器关闭之前销毁。

过滤器链

Web项目支持多个过滤器。

FilterChain.doFilter()方法

这个方法是执行目标资源,或是执行下一个过滤器,如果没有下一个过滤器那么执行的就是目标资源,如果有,

那么执行下一个过滤器。

多个过滤器的执行顺序:

web.xml配置文件的<filter-mapping>的配置顺序决定了过滤器的执行顺序。

注解中的顺序是难以控制的,在给Filter命名的时候注意名字首字母的顺序,这一般是执行的顺序的依据。

过滤器链

过滤器示意图:

执行过程:

代码实现

在第一个过滤器的基础上我们再增加第二个过滤器对同一页面进行过滤操作。

SecondFilter.java源代码:

package com.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;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class SecondFilter
 */
@WebFilter(filterName="SecondFilter",urlPatterns={"/index.jsp"})
public class SecondFilter implements Filter {

    /**
     * Default constructor. 
     */
    public SecondFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("destroy------SecondFilter");
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("start------SecondFilter");
		// pass the request along the filter chain
		chain.doFilter(request, response);
		System.out.println("end------SecondFilter");
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("init------SecondFilter");
	}

}

执行结果:

销毁方法同样在关闭服务器之前执行。

时间: 2024-10-28 11:23:39

Java Web学习(34):Filter学习(一)的相关文章

java web (j2ee)学习路线 —— 将青春交给命运

RESON TO DO JAVA WEB:1.JAVA WEB(企业级)  2.Android和iOS过于火爆并且不兼容 一.JAVA WEB开发需要的知识储备 1.      基本的网页设计语言:HTML.JavaScript.CSS 2.      制作动态网站:Java.JSP(servelt) 3.      数据库:MySQL.SQL Server.SQL Lite.Access.Oracle 4.      流行的框架:MVC思想和原理——了解Struts.Spring.Hibern

【java web】过滤器filter

一.过滤器简介 过滤器filter依赖于servlet容器 所谓过滤器顾名思义是用来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求, 这一点,是拦截器无法做到的.在Java Web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或 者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts

Java web 实现 之 Filter分析ip统计网站的访问次数

统计工作需要在所有资源之前都执行,那么就可以放到Filter中了. 我们这个过滤器不打算做拦截操作!因为我们只是用来做统计的. 用什么东西来装载统计的数据.Map<String,Integer> 整个网站只需要一个Map即可! Map什么时候创建(使用ServletContextListener,在服务器启动时完成创建,并只在到ServletContext中),Map保存到哪里!(Map保存到ServletContext中!!!) Map需要在Filter中用来保存数据 Map需要在页面使用,

Java Web学习(3):Win7 64位操作系统搭建Java Web开发环境

一搭建Java Web开发环境的总体概览 工欲善其事必先利其器.学会搭建Java Web开发环境是学习JSP动态网站开发的最基本技能之一.主要介绍在 Windows 7 64位操作系统下搭建Java Web开发环境的过程,主要包括JDK的安装与配置.Tomcat的安装与配置. Eclipse IDE for Java EE Developers的安装与配置. 在这里推荐使用的: 1)Java  JDK 8.0 2)Server   Tomcat 8.0 3)IDE   Eclipse IDE f

Java web开发路线--Java学习资料汇总

Java web开发是什么? 先来说说java体系,包含:javaSE.javaEE.javaME,其实目前关注主要是javaEE,但学些javaEE必须先学习javaSE(因为这个是java基础).Java web开发其实是应用javaEE实现web应用的开发,是用Java技术来解决相关web互联网领域的技术总和. web开发主要包括前端开发和后端开发,前端主要是HTML.CSS.JS等相关技术,后端技术主要有JavaEE技术.数据库技术.文件存储技术等.java体系比较庞大,也是很多人比较迷

Java Web开发中MVC设计模式简介

一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条理性,对于一个小型的网站这样的编写没有任何问题,但是一但我们需要编写大型的web工程的话,我们现有的编写模式会造成web应用的可扩展性较差,而且一但出现问题不能准确的定位出问题出在哪里. Java是一门应用设计模式比较广泛的语言.目前主流提出的23种设计模式均可在Java语言编写的程序中所应用.目前

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

[原创]java WEB学习笔记44:Filter 简介,模型,创建,工作原理,相关API,过滤器的部署及映射的方式,Demo

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

Java web学习filter (1)

一.概念:Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源: 例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能.二.Filter简介Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filte

java web filter 学习(2)

本文主要对filter的基本使用进行了讲解,其中涉及到了 filter是什么 一个filter处理一个jsp 多个filter处理一个jsp filter是什么 Filter 是java下的一种过滤器 ,能实现对java web程序 客户端和服务器端消息的过滤,也就是在服务器段接受request之前,可以预先对request进行处理,或在客户端接受response之前,对response进行处理. Filter的使用非常灵活,是在"链"到客户端和服务器之间的,在需要时可以配置到客户端与