上班闲得无聊,写写博客学习一下Servlet过滤器吧!无所事实的日子真是难过。自己找事做吧。。。努力努力!!
Servlet过滤器是在Java Servlet规范2.3中定义的,因此所有实现这一规范的Servlet容器都支持Servlet过滤器。
Servlet能够对Servlet容器的请求和响应对象进行检查和修改。Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用。Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request Header和Request内容。在Servlet被调用之后检查Response对象,修改Response Header和Response内容。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件。
Servlet过滤器具有以下特点:
- Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象
- 可以指定Servlet过滤器和特定的URL关联,只有当客户请求访问此URL时,才会触发过滤器工作
- Servlet过滤器是Java Servlet规范2.3的一部分,因此所有实现Java Servlet规范2.3的Servlet容器都支持Servlet过滤器
- 贸易独立的Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象
1、创建Servlet过滤器
所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:
- init(FileterConfig):这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servelt过滤器的初始化参数
- doFilter(ServletRequest,ServletResponse,FilterChain):这个方法完成实际的过滤操作。当客户请求访问与过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器
- destroy():Servlet容器在销毁过滤器实例前调用该方法,在这个方法中可以释放Servlet过滤器占用的资源
下面是一个过滤器的例子,这个名叫NoteFilter的过滤器可以拒绝列在黑名单上的客户访问留言簿,而且能将服务器响应客户请求所花的时间写入日志。NoteFilter的源代码如下:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class NoteFilter implements Filter{
private FilterConfig config=null;
private String blackList=null;
public void init(FilterConfig config) throws ServletException{
this.config=config;
blackList=config.getInitParameter("blacklist");
}
public void destroy(){
config=null;
}
public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException,ServletException{
String username=((HttpServletRequest) request).getParameter("username");
if(username!=null)
username=new String(username.getBytes("ISO-8859-1"),"GB2312");
if(username!=null&&username.indexOf(blackList)!=-1){
response.setContentType("text/html;charset=GB2312");
PrintWriter out=response.getWriter();
out.println("<html><head></head><body>");
out.println("<h1>对不起"+username+",你没有权限留言</h1");
out.println("</body></html>");
out.flush();
return;
}
long before=System.currentTimeMillis();
config.getServletContext().log.(NoteFilter:before call chain.doFilter());
chain.doFilter(request,response);
config.getServletContext().log("NoteFilter:after call chain.doFilter()");
long after=System.currentTimeMillis();
String name="";
if(request instanceOf HttpServletRequest){
name=((HttpServletRequest)request).getRequestURI();
}
config.getServletContext().log("NoteFilter:"+name+":"+(after-before)+"ms");
}
}
当NoteFilter初始化时,它调用config.getInitParameter("blacklist")方法,从Web.xml文件中读取初始化参数blacklist,这个参数表示被禁止访问留言簿的客户黑名单。
在NoteFilter的doFilter()方法中首先从request对象中读取客户姓名,然后将客户姓名转换为中文字符编码。如果客户姓名中包含黑名单里的字符串,那么将直接向客户端返回一个拒绝网页。由于在这种情况下没有调用chain.doFilter()方法,因此客户请求不会到达所访问的Web组件。
如果客户名不在黑名单里,NoteFilter的doFilter方法就会调用chain.doFilter()方法,这个方法用于调用过滤器链中后续过滤器的doFilter()方法。假如没有后续过滤器,那么就反客户请求传给相应的Web组件。在本例中,在调用 chain.doFilter()方法前后都生成了一些日志,并且记录了调用chain.doFilter()方法前后的时间,从而计算出Web组件响应客户请求所花的时间。
2、发布Servlet过滤器
发布Servlet过滤器时,必须在web.xml文件中加入<filter>元素和<filter-mapping>元素。<filter>元素用来定义一个过滤器,如下所示:
<filter>
<filter-name>NoteFilter</filter-name>
<filter-class>NoteFilter</filter-class>
<init-param>
<param-name>blacklist</param>
<param-value>捣蛋鬼</param-value>
</init-param>
</filter>
以上代码中,<filter-name>属性指定过滤器的名字,<filter-class>指定过滤器的类名。<init-param>子元素为过滤器实例提供初始化参数,它包含一对参数名和参数值,在<filter>元素中可以包含多具<init-param>子元素。在这里定义一个名为blacklist的参数,在NoteFilter中将读取这个参数,它表示禁止留言的客户黑名单。
<filter-mapping>元素用于将过滤器和URL关联,如下所示:
<filter-mapping>
<filter-name>NoteFilter</Filter-name>
<url-pattern>/note</url-pattern>
</filter-mapping>
分享到:
相关推荐
Servlet过滤器的简单使用,实现一个登陆界面。代码和博文几乎一致。
servlet 过滤器做的简单登陆demo 初学者的简单例子。
比较好也比较常见的方法是用专门的servlet过滤器进行过滤。java中有个Filter类专门从事这类工作,下面以一个简单的实例进行演示: 实例说明:假设有一个web应用软件,如果是正常途径登录,我们会在其session中放入...
servlet过滤器实例经典过滤器,手把手交你配置过滤器,五大常用过滤器源码,走过路过的同事们注意了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
简单的实现了一个Servlet过滤器,并配有文档按步骤教你怎么做
这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数。 b、doFilter(ServletRequest,ServletResponse,FilterChain)...
servlet过滤器配置及运行过程,servlet实例用法。
servlet过滤器和监听器,servlet过滤器和监听器课件,servlet过滤器和监听器PPT
过滤器提供一种面向对象的模块化机制,用以将公共任务封装到可插入的组件中。...由于是纯Java实现,所以Servlet过滤器是跨平台的模块化和可重用性,使得它们很容易地被部署到任何相容的J2EE环境中。
servlet过滤器详解
一个超帅的jsp过滤器 ,对登录进行验证
servlet 过滤器例子 filterservlet 过滤器例子 filterservlet 过滤器例子 filter 如果是action 则需要改动url patten
用过滤器来验证用户是否登录
Servlet过滤器大全
蔡世友 Servlet 过滤器
第13章使用Servlet过滤器和监听器,基础知识
Servlet过滤器与监听器
tomcat容器中servlet过滤器用法举例
最简单的写法 只要JSP页面的 编码格式和 web.xml 编码格式一样就行