一个servlet登陆过滤器.docx
- 文档编号:27280083
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:6
- 大小:17.50KB
一个servlet登陆过滤器.docx
《一个servlet登陆过滤器.docx》由会员分享,可在线阅读,更多相关《一个servlet登陆过滤器.docx(6页珍藏版)》请在冰豆网上搜索。
一个servlet登陆过滤器
一个servlet登陆过滤器
1.Servlet过滤器是什么?
Servlet过滤器是小型的Web组件,它们拦截请求和响应,以便查看、提取或以某种方式操作正在客户机和服务器之间交换的数据。
过滤器是通常封装了一些功能的Web组件,这些功能虽然很重要,但是对于处理客户机请求或发送响应来说不是决定性的。
典型的例子包括记录关于请求和响应的数据、处理安全协议、管理会话属性,等等。
过滤器提供一种面向对象的模块化机制,用以将公共任务封装到可插入的组件中,这些组件通过一个配置文件来声明,并动态地处理。
Servlet过滤器中结合了许多元素,从而使得过滤器成为独特、强大和模块化的Web组件。
也就是说,Servlet过滤器是:
声明式的:
过滤器通过Web部署描述符(web.xml)中的XML标签来声明。
这样允许添加和删除过滤器,而无需改动任何应用程序代码或JSP页面。
动态的:
过滤器在运行时由Servlet容器调用来拦截和处理请求和响应。
灵活的:
过滤器在Web处理环境中的应用很广泛,涵盖诸如日志记录和安全等许多最公共的辅助任务。
过滤器还是灵活的,因为它们可用于对来自客户机的直接调用执行预处理和后期处理,以及处理在防火墙之后的Web组件之间调度的请求。
最后,可以将过滤器链接起来以提供必需的功能。
模块化的:
通过把应用程序处理逻辑封装到单个类文件中,过滤器从而定义了可容易地从请求/响应链中添加或删除的模块化单元。
可移植的:
与Java平台的其他许多方面一样,Servlet过滤器是跨平台和跨容器可移植的,从而进一步支持了Servler过滤器的模块化和可重用本质。
可重用的:
归功于过滤器实现类的模块化设计,以及声明式的过滤器配置方式,过滤器可以容易地跨越不同的项目和应用程序使用。
透明的:
在请求/响应链中包括过滤器,这种设计是为了补充(而不是以任何方式替代)servlet或JSP页面提供的核心处理。
因而,过滤器可以根据需要添加或删除,而不会破坏servlet或JSP页面。
2.Servlet过滤器体系结构正如其名称所暗示的,Servlet过滤器用于拦截传入的请求和/或传出的响应,并监视、修改或以某种方式处理正在通过的数据流。
过滤器是自包含、模块化的组件,可以将它们添加到请求/响应链中,或者在无需影响应用程序中其他Web组件的情况下删除它们。
过滤器仅只是改动请求和响应的运行时处理,因而不应该将它们直接嵌入Web应用程序框架,除非是通过ServletAPI中良好定义的标准接口来实现。
Web资源可以配置为没有过滤器与之关联(这是默认情况)、与单个过滤器关联(这是典型情况),甚至是与一个过滤器链相关联。
那么过滤器究竟做什么呢?
像servlet一样,它接受请求并响应对象。
然后过滤器会检查请求对象,并决定将该请求转发给链中的下一个组件,或者中止该请求并直接向客户机发回一个响应。
如果请求被转发了,它将被传递给链中的下一个资源(另一个过滤器、servlet或JSP页面)。
在这个请求设法通过过滤器链并被服务器处理之后,一个响应将以相反的顺序通过该链发送回去。
这样就给每个过滤器都提供了根据需要处理响应对象的机会。
当过滤器在Servlet2.3规范中首次引入时,它们只能过滤Web客户机和客户机所访问的指定Web资源之间的内容。
如果该资源然后将请求调度给其他Web资源,那就不能向幕后委托的任何请求应用过滤器。
2.4规范消除了这个限制。
Servlet过滤器现在可以应用于J2EEWeb环境中存在请求和响应对象的任何地方。
因此,Servlet过滤器可以应用在客户机和servlet之间、servlet和servlet或JSP页面之间,以及所包括的每个JSP页面之间。
这才是我所称的强大能力和灵活性!
3.编写实现类的程序
过滤器API包含3个简单的接口,它们整洁地嵌套在javax.servlet包中。
那3个接口分别是Filter、FilterChain和FilterConfig。
从编程的角度看,过滤器类将实现Filter接口,然后使用这个过滤器类中的FilterChain和FilterConfig接口。
该过滤器类的一个引用将传递给FilterChain对象,以允许过滤器把控制权传递给链中的下一个资源。
FilterConfig对象将由容器提供给过滤器,以允许访问该过滤器的初始化数据。
为了与我们的三步模式保持一致,过滤器必须运用三个方法,以便完全实现Filter接口:
init():
这个方法在容器实例化过滤器时被调用,它主要设计用于使过滤器为处理做准备。
该方法接受一个FilterConfig类型的对象作为输入。
doFilter():
与servlet拥有一个service()方法(这个方法又调用doPost()或者doGet())来处理请求一样,过滤器拥有单个用于处理请求和响应的方法?
D?
DdoFilter()。
这个方法接受三个输入参数:
一个ServletRequest、response和一个FilterChain对象。
destroy():
正如您想像的那样,这个方法执行任何清理操作,这些操作可能需要在自动垃圾收集之前进行。
SessionFilter.java
packagenet.pms.web.filter;importjava.io.IOException;importjavax.servlet.Filter;
importjavax.servlet.FilterChain;
importjavax.servlet.FilterConfig;
importjavax.servlet.ServletException;
importjavax.servlet.ServletRequest;
importjavax.servlet.ServletResponse;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjavax.servlet.http.HttpServletResponseWrapper;/**
*@authorjfish
*@since2006.1.12
*/
publicclassSessionFilterimplementsFilter{publicstaticbooleanisContains(Stringcontainer,String[]regx){
booleanresult=false;for(inti=0;i<regx.length;i++){
if(container.indexOf(regx[i])!
=-1){
returntrue;
}
}
returnresult;
}publicFilterConfigconfig;publicvoidsetFilterConfig(FilterConfigconfig){
this.config=config;
}publicFilterConfiggetFilterConfig(){
returnconfig;
}publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException{HttpServletRequesthttpreq=(HttpServletRequest)request;
HttpServletResponsehttpres=(HttpServletResponse)response;HttpServletResponseWrapperwrapper=newHttpServletResponseWrapper(
(HttpServletResponse)response);
StringlogonStrings=config.getInitParameter("logonStrings");
StringincludeStrings=config.getInitParameter("includeStrings");
StringredirectPath=httpreq.getContextPath()
+config.getInitParameter("redirectPath");
Stringdisabletestfilter=config.getInitParameter("disabletestfilter");if(disabletestfilter.toUpperCase().equals("Y")){
chain.doFilter(request,response);
return;
}
String[]logonList=logonStrings.split(";");
String[]includeList=includeStrings.split(";");
Objectuser=httpreq.getSession().getAttribute("userinfo");
if(user==null){
if(!
this.isContains(httpreq.getRequestURI(),includeList)){
chain.doFilter(request,response);
return;
}
if(this.isContains(httpreq.getRequestURI(),logonList)){
chain.doFilter(request,response);
return;
}
wrapper.sendRedirect(redirectPath);}else{
chain.doFilter(request,response);
}
}publicvoiddestroy(){
this.config=null;
}publicvoidinit(FilterConfigfilterConfig)throwsServletException{
this.config=filterConfig;
}
}4.配置Servlet过滤器
在web.xml中:
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>net.pms.web.filter.SessionFilter</filter-class>
<init-param>
<param-name>logonStrings</param-name>
<param-value>login.jsp</param-value>
</init-param>
<init-param>
<param-name>includeStrings</param-name>
<param-value>.jsp;.html</param-value>
</init-param>
<init-param>
<param-name>redirectPath</param-name>
<param-value>/login.jsp</param-value>
</init-param>
<init-param>
<param-name>disabletestfilter</param-name>
<param-value>N</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其中参数logonStrings,登陆页面
includeStrings,过滤页面参数
redirectPath,没有登陆转向页面
disabletestfilter,过滤器是否有效。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一个 servlet 登陆 过滤器
![提示](https://static.bdocx.com/images/bang_tan.gif)