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 ...
随机推荐
- 完整的开发一个ContentProvider步骤
1.定义自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类.2.向Android系统注册这个"网站",也就是在Android ...
- samba服务器的搭建及使用
一.Samba服务器的安装及配置 1.samba服务器的安装 rpm –ivh /mnt/Packages/samba-3. 5. 10-125. el6.i686.rpm 需要挂载红帽6的光盘 2. ...
- java中的浮点(float)运算
一. 关于浮点运算,需要说明的几点: 1. 在java中,进行浮点运算并不会处理例外情况,所以,即使除数为0,也不会有例外被抛出; 2. 当运算结果是溢出(Infinity)时,结果为Infin ...
- [置顶] API相关工作过往的总结之整体介绍
此系列的总结文章,仅仅是我个人工作总结,有考虑不周之处还请各位同行多多指教. API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是 ...
- aptana 插件离线下载方式
aptana 插件离线下载方式 Aptana 网站改版后取消了eclipse 插件的zip直接下载地址,其实aptana 官网仍还提供aptana 插件的zip包下载不过比较隐蔽而已.很多人在线安装时 ...
- ERP售前顾问形象寓意
几个做销售的朋友一起去X山旅游,一群爱侃的人凑在一起,一顿云山雾罩的神吹是少不了的.突然看到一栋平房前面伸出一个大大的幌子:铁嘴铜牙.下面一行小字:不灵不要钱(管理专家:提供专业解决方案). 销售都是 ...
- 常用cl命令参数解释
紧接前文,第一行cl命令如下: 1> cl /c /IC:\...\include /ZI /nologo- /W3 /WX- /sdl /Od /Oy- /D WIN32 /D _DEBUG ...
- 原生js实现轮播
1,效果图 https://ga20.github.io/slider/ 2,原理图 分三步: 将视口元素设置overflow:hidden 将其图片子元素设置float:left 让橙色的框(包裹) ...
- 【转】Mac访问Windows共享文件夹
相信大多数的用户用Windows访问Windows的共享文件夹是一件很容易的事,但是如果用Mac来访问Windows共享文件夹就会遇到很多的麻烦了,尤其是设置是比较有区别的吗,接下来的将用图文交大家怎 ...
- 【转】windows下vs2008/2010+opencv2.2开发环境搭建
版权声明:本文为博主原创文章,未经博主允许不得转载. 1.下载安装Cmake 2.用cmake配置opencv2.2,然后编译,安装 3. 在vs2008中配置opencv2.2 4.Demo 1.下 ...