JavaWeb学习笔记--filter开发
介绍
自定义的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开发的更多相关文章
- JavaWeb学习笔记——Web开发模式:Mode I和Mode II
- JavaWeb学习笔记总结 目录篇
JavaWeb学习笔记一: XML解析 JavaWeb学习笔记二 Http协议和Tomcat服务器 JavaWeb学习笔记三 Servlet JavaWeb学习笔记四 request&resp ...
- javaweb学习笔记整理补课
javaweb学习笔记整理补课 * JavaWeb: * 使用Java语言开发基于互联网的项目 * 软件架构: 1. C/S: Client/Server 客户端/服务器端 * 在用户本地有一个客户端 ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- ASP.NET MVC学习笔记-----Filter
ASP.NET MVC学习笔记-----Filter(1) Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter Au ...
- ASP.NET MVC学习笔记-----Filter(2)
接上篇ASP.NET MVC学习笔记-----Filter(1) Action Filter Action Filter可以基于任何目的使用,它需要实现IActionFilter接口: public ...
- Django:学习笔记(1)——开发环境配置
Django:学习笔记(1)——开发环境配置 Django的安装与配置 安装Django 首先,我们可以执行python -m django --version命令,查看是否已安装django. 如果 ...
- Android:日常学习笔记(8)———开发微信聊天界面
Android:日常学习笔记(8)———开发微信聊天界面 只做Nine-Patch图片 Nine-Patch是一种被特殊处理过的PNG图片,能够指定哪些区域可以被拉升,哪些区域不可以.
- JavaWeb学习笔记(二十二)—— 过滤器filter
一.什么是过滤器 过滤器filter是JavaWeb三大组件之一,它与Servlet很相似!不过过滤器是用来拦截请求的,而不是处理请求的.WEB开发人员通过Filter技术,对web服务器管理的所有w ...
随机推荐
- 温习PYTHON语法
看WEBPY的源码结构有点晕,原来很多语法结构都忘了,继承之些. 再看A BYTE OF PYTHON.慢慢补.. number = 23 guess = int(raw_input('Enter a ...
- 如何判断一个C++对象是否在堆栈上(通过VirtualQuery这个API来获取堆栈的起始地址,然后就可以得到答案了),附许多精彩评论
昨天有人在QQ群里问到如何判断一个C++对象是否在堆栈上, 我在网上搜索了下, 搜到这个么一个CSDN的帖子http://topic.csdn.net/t/20060124/10/4532966. ...
- JavaScript 中的数字和日期类型
本章节介绍如何掌握Javascript里的数字和日期类型 数字EDIT 在 JavaScript 里面,数字都是双精度浮点类型的 double-precision 64-bit binary form ...
- 【转】Win8/8.1/Win7小技巧:揪出C盘空间占用的真凶
原文网址:http://www.ithome.com/html/win8/55496.htm 不少使用Win8.Win8.1的用户不难发现,原先只占用20G大小的系统盘,随着使用时间的增加,C盘的磁盘 ...
- 【转】如何在 Android 程序中禁止屏幕旋转和重启Activity
原文网址:http://www.cnblogs.com/bluestorm/p/3665890.html 禁止屏幕随手机旋转变化 有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变 ...
- HDOJ 1390 Binary Numbers(进制问题)
Problem Description Given a positive integer n, find the positions of all 1's in its binary represen ...
- 【转】MVC5中的区域(Areas)
MVC本身提倡的就是关注点分离.但是当项目本身的业务逻辑足够复杂,如果所有的业务逻辑都写个Controller文件夹下面的时候,你会看到非常庞大的各种命名的Controller,这个时候区域的作用就非 ...
- 经常使用ARM汇编指令
一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...
- Asp.net +Jquery-uploadify多文件上传
页面代码如下: <link href="JS/jquery.uploadify/uploadify.css" rel="stylesheet" type= ...
- CentOS7 安装chrome浏览器
本篇文章主要记录如何在CentOS7.0上安装chrome. 1.配置yum下载源: 在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repo, 并且在该文件中添加 ...