Servlet与Filter.docx
- 文档编号:11782464
- 上传时间:2023-04-01
- 格式:DOCX
- 页数:16
- 大小:23.63KB
Servlet与Filter.docx
《Servlet与Filter.docx》由会员分享,可在线阅读,更多相关《Servlet与Filter.docx(16页珍藏版)》请在冰豆网上搜索。
Servlet与Filter
Servlet与Filter
1、Servlet是使用JavaServlet应用程序设计接口及相关类和方法的Java程序。
它通过创建一个框架来扩展服务器的能力,以提供在Web上进行请求和响应服务,充当一个桥梁的角色来联系客户机与应用程序,负责把客户机发出的请求封装成程序人员编写的应用程序中需要的对象。
当客户机发送请求至服务器时,服务器可以将请求信息发送给Servlet,并让Servlet建立起服务器返回给客户机的响应。
当启动Web服务器或客户机第一次请求服务时,可以自动装入Servlet。
装入后,Servlet继续运行直到其它客户机发出请求。
2、Servlet的生命周期始于将它装入Web服务器的内存时,并在终止或重新装入Servlet时结束。
(1)初始化
在下列时刻装入Servlet:
如果已配置自动装入选项,则在启动服务器时自动装入
在服务器启动后,客户机首次向Servlet发出请求时
重新装入Servlet时装入Servlet后,服务器创建一个Servlet实例并且调用Servlet的init()方法。
在初始化阶段,Servlet初始化参数被传递给Servlet配置对象。
(2)请求处理
对于到达服务器的客户机请求,服务器创建特定于请求的一个“请求”对象和一个“响应”对象。
服务器调用Servlet的service()方法,该方法用于传递“请求”和“响应”对象。
service()方法从“请求”对象获得请求信息、处理该请求并用“响应”对象的方法以将响应传回客户机。
service()方法可以调用其它方法来处理请求,例如doGet()、doPost()或其它的方法。
(3)终止
当服务器不再需要Servlet,或重新装入Servlet的新实例时,服务器会调用Servlet的destroy()方法。
3、servlet的配置
Java代码
1.
2.
3.
4. com.anne.servlet.AdvExtractServlet
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
com.anne.servlet.AdvExtractServlet
Servlet的配置一定要有
配置了初始化servlet需要用到的参数。
Java代码
1.public class AdvExtractServlet extends HttpServlet{
2. private String encoding;
3. @Override
4. public void init(ServletConfig config) throws ServletException {
5. super.init(config);
6. encoding = config.getInitParameter("encoding");
7. ……
8. }
9.}
publicclassAdvExtractServletextendsHttpServlet{
privateStringencoding;
@Override
publicvoidinit(ServletConfigconfig)throwsServletException{
super.init(config);
encoding=config.getInitParameter("encoding");
……
}
}
如上面
4、Filter。
Filter与servlet是密不可分的。
Tomcat在接收到一个来自客户端(如浏览器)的请求之后,在这个请求被传递给servlet之前,需要经过层层Filter的过滤。
它能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response。
一个filter必须实现javax.servlet.Filter接口并定义三个方法:
1.voidsetFilterConfig(FilterConfigconfig)//设置filter的配置对象
2.FilterConfiggetFilterConfig()//返回filter的配置对象;
3.voiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)//执行filter的工作
Filter与servlet是一个层层包裹的关系,如下图:
对于每个request,将会先进入Filter1的doFilter()方法,在这个方法中会调用chain.doFilter()方法把控制权交给Filter2,然后在Filter2的doFilter()方法中会调用servlet的servici()方法,进入servlet,在离开servlet一层之后,依次退回到Filter2与Filter1,进行doFilter()中的后续处理,这里可以对从servlet返回来的response进行处理。
因此filter的实质就是拦截器(interceptor),它与SpringAOP中的包围通知(MethodInterceptor)类似,层层的包围住servlet。
常见的filter的应用有:
权限控制(如Acegi的实现),记录日志,转换编码格式,加密等。
Filter技术是servlet2.3新增加的功能.servlet2.3是sun公司与2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则.由于众多的参与者的共同努力,servlet2.3比以往功能都强大了许多,而且性能也有了大幅提高.
它新增加的功能包括:
1.应用程序生命周期事件控制;
2.新的国际化;
3.澄清了类的装载规则;
4.新的错误及安全属性;
5.不赞成使用HttpUtils类;
6.各种有用的方法;
7.阐明并扩展了几个servletDTD;
8.filter功能.
其中最重要的就是filter功能.它使用户可以改变一个request和修改一个response.Filter不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response.换种说法,filter其实是一个”servletchaining”(servlet链).一个filter包括:
1.在servlet被调用之前截获;
2.在servlet被调用之前检查servletrequest;
3.根据需要修改request头和request数据;
4.根据需要修改response头和response数据;
5.在servlet被调用之后截获.
你能够配置一个filter到一个或多个servlet;单个servlet或servlet组能够被多个filter使用.几个实用的filter包括:
用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLTfilter等.
一个filter必须实现javax.servlet.Filter接口并定义三个方法:
1.voidsetFilterConfig(FilterConfigconfig)//设置filter的配置对象;
2.FilterConfiggetFilterConfig()//返回filter的配置对象;
3.voiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)//执行filter的工作.
服务器每次只调用setFilterConfig方法一次准备filter的处理;调用doFilter方法多次以处理不同的请求.FilterConfig接口有方法可以找到filter名字及初始化参数信息.服务器可以设置FilterConfig为空来指明filter已经终结.
每一个filter从doFilter()方法中得到当前的request及response.在这个方法里,可以进行任何的针对request及response的操作.(包括收集数据,包装数据等).filter调用chain.doFilter()方法把控制权交给下一个filter.一个filter在doFilter()方法中结束.如果一个filter想停止request处理而获得对response的完全的控制,那它可以不调用下一个filter.
一个filter可以包装request或response以改变几个方法和提供用户定制的属性.Api2.3提供了HttpServletRequestWrapper和HttpServletResponseWrapper来实现.它们能分派最初的request和response.如果要改变一个方法的特性,必须继承wapper和重写方法.下面是一段简单的日志filter用来记录所有request的持续时间.
publicclassLogFilterimplementsFilter{
FilterConfigconfig;
publicvoidsetFilterConfig(FilterConfigconfig){
this.config=config;
}
publicFilterConfiggetFilterConfig(){
returnconfig;
}
publicvoiddoFilter(ServletRequestreq,
ServletResponseres,
FilterChainchain){
ServletContextcontext=getFilterConfig().getServletContext();
longbef=System.currentTimeMillis();
chain.doFilter(req,res);//nochainparameterneededhere
longaft=System.currentTimeMillis();
context.log("Requestto"+req.getRequestURI()
+":
"+(aft-bef));
}
}
当server调用setFilterConfig(),filter保存config信息.在doFilter()方法中通过config信息得到servletContext.如果要运行这个filter,必须去配置到web.xml中.以tomcat4.01为例:
log//filter名字
LogFilter//filterclass(上例的servlet)
把这个web.xml放到web-inf中(详请参考tomcat帮助文档).
当每次请求一个request时(如index.jsp),先到LogFilter中去并调用doFilter()方法,然后才到各自的servlet中去.如果是一个简单的servlet(只是一个页面,无任何输出语句),那么可能的输出是:
Requestto/index.jsp:
10
Filter技术是servlet2.3新增加的功能.servlet2.3是sun公司与2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则.由于众多的参与者的共同努力,servlet2.3比以往功能都强大了许多,而且性能也有了大幅提高.
它新增加的功能包括:
1.应用程序生命周期事件控制;
2.新的国际化;
3.澄清了类的装载规则;
4.新的错误及安全属性;
5.不赞成使用HttpUtils类;
6.各种有用的方法;
7.阐明并扩展了几个servletDTD;
8.filter功能.
其中最重要的就是filter功能.它使用户可以改变一个request和修改一个response.Filter不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response.换种说法,filter其实是一个”servletchaining”(servlet链).一个filter包括:
1.在servlet被调用之前截获;
2.在servlet被调用之前检查servletrequest;
3.根据需要修改request头和request数据;
4.根据需要修改response头和response数据;
5.在servlet被调用之后截获.
你能够配置一个filter到一个或多个servlet;单个servlet或servlet组能够被多个filter使用.几个实用的filter包括:
用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLTfilter等.
一个filter必须实现javax.servlet.Filter接口并定义三个方法:
1.voidsetFilterConfig(FilterConfigconfig)//设置filter的配置对象;
2.FilterConfiggetFilterConfig()//返回filter的配置对象;
3.voiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)//执行filter的工作.
服务器每次只调用setFilterConfig方法一次准备filter的处理;调用doFilter方法多次以处理不同的请求.FilterConfig接口有方法可以找到filter名字及初始化参数信息.服务器可以设置FilterConfig为空来指明filter已经终结.
每一个filter从doFilter()方法中得到当前的request及response.在这个方法里,可以进行任何的针对request及response的操作.(包括收集数据,包装数据等).filter调用chain.doFilter()方法把控制权交给下一个filter.一个filter在doFilter()方法中结束.如果一个filter想停止request处理而获得对response的完全的控制,那它可以不调用下一个filter.
一个filter可以包装request或response以改变几个方法和提供用户定制的属性.Api2.3提供了HttpServletRequestWrapper和HttpServletResponseWrapper来实现.它们能分派最初的request和response.如果要改变一个方法的特性,必须继承wapper和重写方法.下面是一段简单的日志filter用来记录所有request的持续时间.
publicclassLogFilterimplementsFilter{
FilterConfigconfig;
publicvoidsetFilterConfig(FilterConfigconfig){
this.config=config;
}
publicFilterConfiggetFilterConfig(){
returnconfig;
}
publicvoiddoFilter(ServletRequestreq,
ServletResponseres,
FilterChainchain){
ServletContextcontext=getFilterConfig().getServletContext();
longbef=System.currentTimeMillis();
chain.doFilter(req,res);//nochainparameterneededhere
longaft=System.currentTimeMillis();
context.log("Requestto"+req.getRequestURI()
+":
"+(aft-bef));
}
}
当server调用setFilterConfig(),filter保存config信息.在doFilter()方法中通过config信息得到servletContext.如果要运行这个filter,必须去配置到web.xml中.以tomcat4.01为例:
log//filter名字
LogFilter//filterclass(上例的servlet)
把这个web.xml放到web-inf中(详请参考tomcat帮助文档).
当每次请求一个request时(如index.jsp),先到LogFilter中去并调用doFilter()方法,然后才到各自的servlet中去.如果是一个简单的servlet(只是一个页面,无任何输出语句),那么可能的输出是:
Requestto/index.jsp:
10
下面是几个运用实例
Filter过滤器的使用
本篇文章是介绍javax.servlet包中Filter的几个功能,一是字符编码过滤,二是拦截指文件夹中的文件,实现登录验证.实现以上两个功能需以下几个步骤:
1、实现javax.servlet.Filter接口,编写两个类,如下:
/**
*作用:
过滤编码
*/
packagefilter;
importjava.io.IOException;
importjavax.servlet.*;
importjavax.servlet.http.HttpServletRequest;
publicclassEncodingFilterimplementsFilter
{
protectedFilterConfigfilterConfig;
privateStringtargetEncoding;
publicEncodingFilter()
{
targetEncoding="gb2312";//直接初始化0912
}
publicvoidinit(FilterConfigfilterconfig)throwsS
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Servlet Filter