介绍
自定义的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. 专门讲讲这个MYSQL授权当中的with grant option的作用

    对象的owner将权限赋予某个用户(如:testuser1) grant select ,update on bd_corp to testuser1 [with grant option ]1.如果 ...

  2. 使用AlertDialog创建对话框的大致步骤

    1.创建AlertDialog.Builder对象,该对象是AlertDialog的创建器.2.调用AlertDialog.Builder的方法为对话框设置图标.标题.内容等.3.调用AlertDia ...

  3. 输出宽字符数组 C++

    std::cout << "ASCII and ANSI" << std::endl;std::wcout << L"INSERT M ...

  4. live555的编译及使用

    live555是个流媒体C++开源库,VLC的Meida Player就使用了它的API完成的RTSP客户端,由于VLC的SDK没有提供相关record流到视频文件的API,所以我想用过live555 ...

  5. 带’*’号字符串的匹配

    目标: 判断源字符串中是否含有指定子串,子串可能会有*号通配符. 初步测试没问题.记录下来.后面要是有问题再来纠正. #include <string> using namespace s ...

  6. MD中bitmap源代码分析--设置流程

    1. 同步/异步刷磁盘 Bitmap文件写磁盘分同步和异步两种: 1) 同步置位:当盘阵有写请求时,对应的bitmap文件相应bit被置位,bitmap内存页被设置了DIRTY标志.而在下发写请求给磁 ...

  7. 【KMP】Cyclic Nacklace

    KMP算法 next[]深入了解,做到这题才真正明白next[]的用法,希望后面的题目能理解的更深刻. Problem Description CC always becomes very depre ...

  8. 字符流;字节流;带缓冲的输入输出流;以及用scanner读文件

    概念: InputStream类是字节输入流的抽象类,是所有字节输入流的父类. OutputStream类是字节输入流的抽象类,是所有字节输出流的父类. In(可以理解为读)Out(可以理解为写) 一 ...

  9. 使用zTree控件制作的表格形式的树形+数据菜单

    測试了一下,兼容ie7以上, chrome opera ff 不使用对方css /*------------------------------------- zTree Style version: ...

  10. MySQL数据库中的哈希加密

    数据库安全是数据库中最为重要的环节,只有确保了数据库中数据的安全,才能够更好的发挥数据库的功能,本文将为大家介绍一种很好的数据库加密方法,即哈希加密. 导读:MySQL数据库加密的方法有很多种,不同的 ...