介绍
自定义的Filter类必须实现Filter接口,并且实现Filter接口定义的init() doFilter() destory()方法。其中init为初始化,destory为销毁 doFilter为实现过滤。

doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

该方法的三个参数:request、response用来传递给下一个Filter或者JSP和Servlet,
         chain通过调用其doFilter方法来调用下一个Filter,获得调用原始JSP或Servlet等其他内容。
该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。
这里的ServletRequest和ServletResponse一般需要转换成具体的Servlet实现对于的对象,如:HttpServletRequest和HttpServletResponse。
有些过滤器比较消耗资源,所以需要防止重复过滤,可以在doFilter()方法中判断。

定义过滤器

public class MyFilter implements Filter {

    public void init(FilterConfig fc) {
//过滤器初始化代码
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){
//在这里可以对客户端请求进行检查
//沿过滤器链将请求传递到下一个过滤器。
chain.doFilter(request, response);
//在这里可以对响应进行处理
} public void destroy( ) {
//过滤器被销毁时执行的代码
} }

过滤器映射

<filter>
<filter-name>MyFilter</filter-name>
<filter-class>
com.servlet.TimeTrackFilter
</filter-class>
<init-param>
<param-name>developer</param-name>
<param-value>Developername</param-value>
</init-param>
</filter>
<!--针对一个Servlet做过滤-->
<filter-mapping>
<filter-name>MyFilter</filter-name>
<servlet-name>MyServlet</servlet-name>
</filter-mapping>
<!--针对URL Pattern做过滤-->
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/book/*</url-pattern>
</filter-mapping>

注意:/* 表示拦截所有资源及不存在的资源
   *.jsp 表示拦截所有jsp文件

===========================================================================

例子:登录验证过滤器
dl.html 登录界面

<!DOCTYPE HTML PUBLIC "=//w3c//dtd html 4.0 transitional/cn">
<html lang='zh'>
<head>
<title>登录</title>
</head> <body bgcolor="#FFFFFF">
<h1 align="center"><b>欢迎登陆系统</b></h1>
<form name="login" method = "post" action="servlet/Main">
<p></p>
<table width = "52%"border="2" align ="center">
<tr bgcolor ="#FFFFCC">
<td align = "center" width="43%"><div align="center">用户名:</div></td>
<td width="57%">
<div align="left">
<input type ="text" name = "userID" value="">
</div>
</td>
</tr> <tr bgcolor = "#ccff99">
<td align = "center" width = "43%">
<div align= "center">密码:</div>
</td>
<td width = "57%">
<div align = left>
<input type="password" name= "password" value="">
</div>
</td>
</tr>
</table> <p align="center">
<input type="reset" name= "reset" value = "重置">
<input type="submit" name= "tj" value = "提交">
</form>
</body>
</html>

Main.java 进行页面重定向,判断用户名密码是否正确

public class TimeTrackFilter implements Filter {
private FilterConfig filterConfig=null; public void destroy() {
this.filterConfig=null;
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
Date startTime , endTime;
double totalTime;
StringWriter sw = new StringWriter();
System.out.println("我在Filter中1");
try{
Thread.sleep(2000);
}catch(InterruptedException e){
System.out.println(e.toString());
}
startTime = new Date(); String login=(String) request.getParameter("userID");
if(login==null||"".equals(login)){ //如果没有输入用户名,重定位
HttpServletResponse resp =( HttpServletResponse )response;
resp.sendRedirect("../dl.html");
}
else
chain.doFilter(request, response); //对响应进行处理
endTime = new Date();
totalTime = endTime.getTime()- startTime.getTime();
System.out.println("我在Filter中2");
PrintWriter writer = new PrintWriter(sw);
writer.println("==============\n耗时"+totalTime+"毫秒\n==============");
filterConfig.getServletContext().log(sw.getBuffer().toString());
} public void init(FilterConfig fConfig) throws ServletException {
this.filterConfig=fConfig;
}
}

TimeTrackFilter.java  Main的过滤器,如果没有输入用户名,则重定位到dl.html,否则就继续

public class TimeTrackFilter implements Filter {
private FilterConfig filterConfig=null; public void destroy() {
this.filterConfig=null;
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
Date startTime , endTime;
double totalTime;
StringWriter sw = new StringWriter();
System.out.println("我在Filter中");
try{
Thread.sleep(2000); }catch(InterruptedException e){
System.out.println(e.toString());
}
startTime = new Date(); String login=(String) request.getParameter("userID");
if(login==null||"".equals(login)){ //如果没有输入用户名,重定位
HttpServletResponse resp =( HttpServletResponse )response;
resp.sendRedirect("../dl.html");
}
else
chain.doFilter(request, response); //对响应进行处理
endTime = new Date();
totalTime = endTime.getTime()- startTime.getTime();
System.out.println("我在Filter中");
PrintWriter writer = new PrintWriter(sw);
writer.println("==============\n耗时"+totalTime+"毫秒\n==============");
filterConfig.getServletContext().log(sw.getBuffer().toString());
} public void init(FilterConfig fConfig) throws ServletException {
this.filterConfig=fConfig;
}
}

LoginSuccess.jsp登录成功页面:

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<html>
<head>
<title>登录成功</title>
</head>
<body>
<%String name = request.getParameter("userID"); %>
<h1>欢迎!"<%out.print(name);%> "您已成功登录系统...</h1>
</body>
</html>

LoginFail.java 登录失败页面

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<html>
<head>
<title>登录失败</title>
</head>
<body>
<h1>登录失败,请重新登录...</h1>
</body>
</html>

控制台输出效果:

我在Filter中1
我在Servlet Main中
重定向
我在Filter中2
七月 08, 2015 10:22:21 上午 org.apache.catalina.core.ApplicationContext log
信息: ==============
耗时2015.0毫秒
==============

JavaWeb学习笔记--filter开发的更多相关文章

  1. JavaWeb学习笔记——Web开发模式:Mode I和Mode II

  2. JavaWeb学习笔记总结 目录篇

    JavaWeb学习笔记一: XML解析 JavaWeb学习笔记二 Http协议和Tomcat服务器 JavaWeb学习笔记三 Servlet JavaWeb学习笔记四 request&resp ...

  3. javaweb学习笔记整理补课

    javaweb学习笔记整理补课 * JavaWeb: * 使用Java语言开发基于互联网的项目 * 软件架构: 1. C/S: Client/Server 客户端/服务器端 * 在用户本地有一个客户端 ...

  4. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  5. ASP.NET MVC学习笔记-----Filter

    ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...

  6. ASP.NET MVC学习笔记-----Filter(2)

    接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用,它需要实现IActionFilter接口: public ...

  7. Django:学习笔记(1)——开发环境配置

    Django:学习笔记(1)——开发环境配置 Django的安装与配置 安装Django 首先,我们可以执行python -m django --version命令,查看是否已安装django. 如果 ...

  8. Android:日常学习笔记(8)———开发微信聊天界面

    Android:日常学习笔记(8)———开发微信聊天界面 只做Nine-Patch图片 Nine-Patch是一种被特殊处理过的PNG图片,能够指定哪些区域可以被拉升,哪些区域不可以.

  9. JavaWeb学习笔记(二十二)—— 过滤器filter

    一.什么是过滤器 过滤器filter是JavaWeb三大组件之一,它与Servlet很相似!不过过滤器是用来拦截请求的,而不是处理请求的.WEB开发人员通过Filter技术,对web服务器管理的所有w ...

随机推荐

  1. 在QT程序中使用cout和cin

    1先输入10个数字,再输出. #include <QtCore/QCoreApplication> #include <QtCore/QList> #include <Q ...

  2. MyBatis insert后返回自增字段的值

    如下情况适用支持自增的DB,如MySQL.其他情况参见:MyBatis魔法堂:Insert操作详解(返回主键.批量插入) 1.model public class UserInfo { private ...

  3. HDOJ 1248

    完全背包. 模版. 物品的价值等价于体积. #include <stdio.h> #include <string.h> using namespace std; int ma ...

  4. zookeeper[1] (转)ZooKeeper Programmer's Guide(zookeeper编程向导)---中文

    原文:http://www.cnblogs.com/Xrinehart/p/3512509.html 本文是为想要创建使用ZooKeeper协调服务优势的分布式应用的开发者准备的.本文包含理论信息和实 ...

  5. activity theme parent 属性浅析

    在AndroidManifest.xml文件中,可以对每一个Activity设置android:themetheme的设置 可以设置为系统自带的格式,也可以自定义格式. A: 系统自带格式 1.and ...

  6. 你需要知道的九大排序算法【Python实现】之归并排序

    四.归并排序 基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列.归并过程:比 ...

  7. 导航条上UIBarButtonItem的更改方法(使用initWithCustomView:btn)

    UINavigationController *nav = [[[UINavigationController alloc] initWithRootViewController:self.newMe ...

  8. Linux(CentOS 5.5) Redis安装

    一,什么是redis redis是一个key-value存储系统. 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset ...

  9. Tips:javascript 图片放大和取得尺寸

    1)获取图片尺寸 <img src="http://img.my.csdn.net/uploads/201309/03/1378223257_7957.jpg" alt=&q ...

  10. Java static块

    首先,我们看一个实际例子: class Test{ public static int X=100; public final static int Y=200; public Test(){ Sys ...