Java深入 - Filter过滤器

Java的1.3開始,对servlet2.3规范中增加了过滤器的支持。过滤器可以让我们对目标资源的请求和响应进行截取。

一些filter的特性:

1. Filter是Servlet规范的规定,须要Servlet容器的支持。

2. Filter不能使用Spring框架中的资源对象。

3. Filter仅仅在Servlet前后起作用。

Filter实现

我们须要实现接口Filter中定义的方法:

/*
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the "License").  You may not use this file except
 * in compliance with the License.
 *
 * You can obtain a copy of the license at
 * glassfish/bootstrap/legal/CDDLv1.0.txt or
 * https://glassfish.dev.java.net/public/CDDLv1.0.html.
 * See the License for the specific language governing
 * permissions and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL
 * HEADER in each file and include the License file at
 * glassfish/bootstrap/legal/CDDLv1.0.txt.  If applicable,
 * add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your
 * own identifying information: Portions Copyright [yyyy]
 * [name of copyright owner]
 *
 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
 *
 * Portions Copyright Apache Software Foundation.
 */

package javax.servlet;

import java.io.IOException;

public interface Filter {

	public void init(FilterConfig filterConfig) throws ServletException;

    public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain )
throws IOException, ServletException;

	public void destroy();

}

自己定义一个TestFilter

/**
 * 自己定义一个Filter
 * @author zhuli
 * @date 2014-7-20
 */
public class TestFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("TestFiltern init"); //初始化容器的时候,这边会执行
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
        // TODO Auto-generated method stub
        HttpServletRequest request2 = (HttpServletRequest)request;
        String ip = IPUtil.getClientIp(request2);
        System.out.println("TestFiltern doFilter 请求前面就处理了 + ip: " + ip);
        chain.doFilter(request, response); //传递filter链
        System.out.println("业务处理完了之后,会继续调用这个filter,然后调用这边");
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println("TestFiltern destroy"); //销毁容器的时候。这边会执行
    }

}

结果:

TestFiltern doFilter 请求前面就处理了 + ip: 127.0.0.1

业务逻辑=========

业务处理完了之后,会继续调用这个filter。然后调用这边

Filter配置

在web.xml中。配置servlet前面配置Filter就可以:

url-pattern能够配置符合哪些请求的须要走这个filter

	<!-- TEST filter -->
	<filter>
		<filter-name>testFilter</filter-name>
		<filter-class>com.xxx.test.TestFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>testFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

Filter的运行顺序

能够先看一张图:

如果我们有两个过滤器。TestFilter和TestFilter1。

当web请求进来

->

我们运行TestFilter过滤器中chain.doFilter之前的代码(比如我们的样例中System.out.println("TestFiltern doFilter 请求前面就处理了");)

->

然后运行TestFilter2过滤器中chain.doFilter之前的代码

->

然后Servlet中的service方法

->

然后处理TestFilter2过滤器中chain.doFilter之后的代码

->

然后处理TestFilter过滤器中chain.doFilter之后的代码(比如我们的样例中System.out.println("业务处理完了之后。会继续调用这个filter。然后调用这边");)

Filter生命周期

1. init初始化。在web容器启动的时候。对Filter进行初始化。

初始化会调用init()方法

2. 过滤。详细过滤是doFilter()方法

3. destroy销毁。在容器关闭的时候会对Filter进行销毁。

时间: 2024-08-25 11:20:29

Java深入 - Filter过滤器的相关文章

Java中Filter过滤器的使用

过滤器过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改.判断等,把不符合规则的请求在中途拦截或修改.也可以对响应进行过滤,拦截或修改响应.如下图,浏览器发出的请求先递交给第一个filter进行过滤,符合规则则放行,递交给filter链中的下一个过滤器进行过滤.过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端.当请求通过了链中所有过滤器后就可以访问资源文件了,如果不能通过,则可能在中间某个过滤器中被处理掉.过滤

【Servlet】Java Servet Filter 过滤器

Filter的设计思想Filter是一种AOP的设计思想 : 面向切面 下面这是一个使用filter的登录案例:我们通过一张图片理解理解filer面向切面下面是项目的结构: 下面是jsp文件: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W

java web Filter过滤器解决乱码

package com.kt.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.Serv

Java Web总结十九Filter过滤器

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

Java防止SQL注入2(通过filter过滤器功能进行拦截)

首先说明一点,这个过滤器拦截其实是不靠谱的,比如说我的一篇文章是介绍sql注入的,或者评论的内容是有关sql的,那会过滤掉:且如果每个页面都经过这个过滤器,那么效率也是非常低的. 如果是要SQL注入拦截,可以在数据访问上层的业务层用方法的形式进行手动过滤还靠谱些. 或者使用SQL的参数形式进行,这个绝对是百分百搞得定. 关于SQL注入解释,参考:http://www.cnblogs.com/EasonJim/p/6223216.html 关于filter过滤器使用教程,参考:http://www

Java三大器之过滤器(Filter)的工作原理和代码演示

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

java:(九大内置对象,计算服务器访问次数,filter过滤器)

1.九大内置对象: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page isErrorPage="true" %><!-- 默认是隐藏的false --> <%@ page session="true" %><!-- session默认是显示的true

java web中filter过滤器的使用

编写filter过滤器有两种方法,一种是使用注解配置,另一种是使用web.xml配置,此处使用web.xml配置来实现过滤器 (1)使用web.xml配置过程 <filter> <filter-name>setCharacterFilter</filter-name> <filter-class>com.qst.setCharacterEncodingFilter</filter-class> </filter> <filter

Servlet JSP 二重修炼:Filter过滤器

原网站:http://www.cnblogs.com/Alandre/p/4090491.html 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 真正的朋友就是,当你蒙蔽了所有人的眼睛,也能看穿你真实的样子和心底的痛楚. 前言 好久没写博客了.哈哈~宝刀未老呀,操起笔来准备11.11华华丽丽的来一篇.都说温故知新,这句话绝对正确.按着人的记忆曲线,温故是巩固记忆力的好办法.就像我还是经常翻翻自己写的博客.回头来看看