Servlet过滤器使用

Servlet过滤器使用
Servlet过滤器使用

Servlet过滤器使用(javax.servlet.Filter)作者:本站原创发布时间:2010-06-10来源:JA V A中文网点我投稿

教程由JA V A中文网整理校对发布(https://www.360docs.net/doc/1114779029.html,)

过滤器(Filter)的概念

过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。

在请求到达Servlet/JSP之前,过滤器截获请求。

在响应送给客户端之前,过滤器截获响应。

多个过滤器形成一个过滤器链,过滤器链中不同过滤器的先后顺序由部署文件web.xml中过滤器映射的顺序决定。

最先截获客户端请求的过滤器将最后截获Servlet/JSP的响应信息。

过滤器的链式结构

可以为一个Web应用组件部署多个过滤器,这些过滤器组成一个过滤器链,每个过滤器只执行某个特定的操作或者检查。这样请求在到达被访问的目标之前,需要经过这个过滤器链。

实现过滤器

在Web应用中使用过滤器需要实现javax.servlet.Filter接口,实现Filter接口中所定义的方法,并在web.xml中部署过滤器。

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接口

public void init(FilterConfig config)

web容器调用本方法,说明过滤器正被加载到web容器中去。容器只有在实例化过滤器时才会调用该方法一次。容器为这个方法传递一个FilterConfig对象,其中包含与Filter相关的配置信息。

public void doFilter(ServletRequest request,

ServletResponse response, FilterChain chain)

每当请求和响应经过过滤器链时,容器都要调用一次该方法。需要注意的是过滤器的一个实例可以同时服务于多个请求,特别需要注意线程同步问题,尽量不用或少用实例变量。在过滤器的doFilter()方法实现中,任何出现在FilterChain的doFilter方法之前地方,request是可用的;在doFilter()方法之后response是可用的。

public void destroy()

容器调用destroy()方法指出将从服务中删除该过滤器。如果过滤器使用了其他资源,需要在这个方法中释放这些资源。

部署过滤器

在Web应用的WEB-INF目录下,找到web.xml文件,在其中添加如下代码来声明Filter。

MyFilter

https://www.360docs.net/doc/1114779029.html,.uibe.webdev.MyFilter

developer

TongQiang

针对一个Servlet做过滤

MyFilter

MyServlet

针对URL Pattern做过滤

MyFilter

/book/*

标记是有先后顺序的,它的声明顺序说明容器是如何形成过滤器链的。过滤器应当设计为在部署时很容易配置的形式。通过认真计划和使用初始化参数,可以得到复用性很高的过滤器。过滤器逻辑与Servlet逻辑不同,它不依赖于任何用户状态信息,因为一个过滤器实例可能同时处理多个完全不同的请求。

Servlet过滤器使用(javax.servlet.Filter)(本教程仅供研究和学习,不代表JA V A中文网观点) 本篇文章链接地址:https://www.360docs.net/doc/1114779029.html,/architecture/servlet/101950.shtml

如需转载请注明出自JA V A中文网:https://www.360docs.net/doc/1114779029.html,/

本篇文章来自Java中文网:https://www.360docs.net/doc/1114779029.html,/architecture/servlet/101950.shtml

java过滤器

在基于 JSP 页面系统设计开发中,经常有一批页面需要对用户的身份进行验证,只有合法的用户才可以访问这些页面。显然可以在每个页面中添加身份验证,但这样做会给编程造成很大的麻烦,而且增加多余的代码。那么,如何解决JSP 页面用户身份验证呢? 二、JSP 页面中用户身份验证分析 在有多个用户使用的 JSP 系统中,为了保障系统的隐秘性安全性,就需要对登录系统的用户进行身份验证以保证用户身份的合法性。一个用户首次登录系统后会在session 对象中留下它的标识[1],就可以利用这个标识来完成各个JSP页面的用户身份验证。为了避免每个页面都进行身份验证而出现的麻烦,这里将通过Servlet 过滤器对JSP 页面统一进行身份验证。 三、用户身份验证的设计思路和技术要点 1、设计思路 Servlet 过滤器验证用户是围绕session 对象进行的。首先是实现用户登录的功能,在用户登录成功后产生一个session 标识;然后创建Servlet 过滤器,判断标识值是否正确,如果正确则通过验证,否则将给出提示信息并跳转到用户登录页面。 2、技术要点 使用 Servlet 过滤器实现JSP 页面中用户身份验证,首先必须实现Filter 接口,且重写doFilter() 方法,由doFilter() 方法去处理过滤业务;其次,在web.xml 文件中配置Servlet 过滤器,指定过滤器的名称、过滤器包所在类的名称及过滤器的映射范围等[2]。 四、JSP 页面中用户身份验证的实现 1、用户身份合法性确认 为了能够使用 Servlet 过滤器实现用户对JSP 页面访问的合法性验证,首先需要根据用户登录号和密码等与数据库中的信息相比较,若能匹配成功,则是用户登录成功,就用session 对象存储该用户的标识;然后再由Servlet 过滤器实现对用户访问的各个页面的过滤。存储用户登录成功的session 标识的核心代码为:session.setAttribute("user", 用户登录号 )。 2、Servlet 过滤器的实现 用 Servlet 过滤器实现用户身份验证的关键代码如下: package hzu.util.filters; public class UserFilter extends HttpServlet implements Filter { private FilterConfig filterConfig; public void init(FilterConfig filterConfig) throws ServletException{ this.filterConfig=filterConfig;

使用Servlet过滤器实现用户登录验证

package Filters;import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class LogOrNot implements javax.servlet.Filter { private FilterConfig config; private String logon_page; private String home_page; public void destroy() { config = null; } public void init(FilterConfig filterconfig) throws ServletException { // 从部署描述符中获取登录页面和首页的URI config = filterconfig; logon_page = filterconfig.getInitParameter("LOGON_URI"); home_page = filterconfig.getInitParameter("HOME_URI"); System.out.println(home_page); if (null == logon_page || null == home_page) { throw new ServletException("没有找到登录页面或主页"); } } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse rpo = (HttpServletResponse) response; javax.servlet.http.HttpSession session = req.getSession(); try { req.setCharacterEncoding("utf-8"); } catch (Exception e1) { e1.printStackTrace(); } String userId = (String) session.getAttribute("UserId"); String request_uri = req.getRequestURI().toUpperCase();// 得到用户请求的URI String ctxPath = req.getContextPath();// 得到web应用程序的上下文路径 String uri = request_uri.substring(ctxPath.length()); // 去除上下文路径,得到剩余部分的路径

Servlet过滤器使用

Servlet过滤器使用(javax.servlet.Filter)作者:本站原创发布时间:2010-06-10来源:JA V A中文网点我投稿 教程由JA V A中文网整理校对发布(https://www.360docs.net/doc/1114779029.html,) 过滤器(Filter)的概念 过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。 在请求到达Servlet/JSP之前,过滤器截获请求。 在响应送给客户端之前,过滤器截获响应。 多个过滤器形成一个过滤器链,过滤器链中不同过滤器的先后顺序由部署文件web.xml中过滤器映射的顺序决定。 最先截获客户端请求的过滤器将最后截获Servlet/JSP的响应信息。 过滤器的链式结构 可以为一个Web应用组件部署多个过滤器,这些过滤器组成一个过滤器链,每个过滤器只执行某个特定的操作或者检查。这样请求在到达被访问的目标之前,需要经过这个过滤器链。 实现过滤器 在Web应用中使用过滤器需要实现javax.servlet.Filter接口,实现Filter接口中所定义的方法,并在web.xml中部署过滤器。 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接口

实验六 Servlet过滤器的使用

实验六Servlet过滤器的使用 一、实验目的 1. 了解过滤器的作用; 2. 掌握过滤器的开发与部署的步骤; 3. 了解过滤器链。 二、实验原理 过滤器是web服务器上的组件,它们对客户和资源之间的请求和响应进行过滤。 过滤器的工作原理是:当servlet容器接收到对某个资源的请求,它要检查是否有过滤器与之关联。如果有过滤器与该资源关联,servlet容器将把该请求发送给过滤器。在过滤器处理完请求后,它将做下面3件事: ?产生响应并将其返回给客户; ?如果有过滤器链,它将把(修改过或没有修改过)请求传递给下一个过滤器; ?将请求传递给不同的资源。 当请求返回到客户时,它是以相反的方向经过同一组过滤器返回。过滤器链中的每个过滤器够可能修改响应。 过滤器API主要包括:Filter、FilterConfig和FilterChain接口。 三、实验内容与步骤 编写一个过滤器改变请求编码。 【步骤1】编写一个loginform.html文件,代码如下: 使用过滤器改变请求编码

请输入用户名和口令:

用户名:
口令:

java web 过滤器

传智播客java web 过滤器 今日学习Servlet的过滤器部分,百闻不如一见。以后我在课后做练习时,发现多个Servlet 之间转发容易产生问题。 详细出处参考:https://www.360docs.net/doc/1114779029.html,/article/21017.htm根本不利于使用,Servlet应该本是为简化工作而创造的啊!我当时觉得是我的设计框架产生了问题。第二天我便问方老师,确实是使用上有些问题。比如,显示访问计数,我把它单独写成了一个Servlet,什么地方需要它时,便由那个Servlet.include引用计数的Servlet。但这样总会产生一些问题和使用上的不便。比如include的Servlet必须使用相同的流,如果使用forward后任何输出都无效了。 方老师当时建议,把有些功能写到一起。但最后提到了过滤器,那时我便对过滤器产生了兴趣,今日也终于一睹芳容!让人十分喜欢! ServletFilter,Servlet过滤器: Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter 技术可以对web服务器管理的所有web资源:Jsp, Servlet, 静态图片文件或静态html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。 ServletAPI提供了一个Filter接口,实现这个接口的Servlet就是一个过虑器。过虑器在WEB 应用访问流程中如下: 由图可见,只要我们编写了过滤器,可以对一切访问WEB应用的连接进行过滤。比如,用户访问权限、统一WEB编码… Filter是如何实现拦截的? 实现了Filter接口的Servlet是过滤器,因为Filter接口有一个doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法,只要用户访问我们在web.xml中配置的映射目录,服务器便会调用过滤器的doFilter方法。我们在这里实现过虑功能代码,当我们调用chain.doFilter(request, response);方法时,将请求反给服务器服务器再去调用相当的Servlet。如果我们不调用此方法,说明拒绝了用户的请求。 Filter开发入门: 在WEB应用中添加一个过滤器,有两步工作需要完成: 1.编写实现了Filter接口的Servlet——过滤器。 2.在web.xml中配置过滤器: (1). 标签添加器 (2). 注册过滤器的映射目录(过滤目录),与注册Servlet一样。 在实际WEB应用中,我们可能需要编写多个过虑器,比如:1.统一WEB编码的过滤器(过虑所有访问)2.用户访问权限管理。这样,用户的访问需要选经过过滤器1过滤然后再经过过滤器2过滤。doFilter中有一个FilterChain参数,这个参数是服务器根据web.xml中配置的过滤器,按照先后顺序生成的过滤器链。当我们在doFilter方法中调用chain.doFilter(request, response);方法时,服务器会查找过滤链中是否还有过滤器,如果有继续调用下一个过滤器,如果没有将调用相应的Servlet处理用户请求。 Filter接口的其他细节: 1.Filter的Init(FilterConfig filterConfig)方法: 与Servlet的Init方法一样,在创建时被调用,之后被保存在内存中直至服务器重启或关闭时Filter实例才会被销毁。与Servlet不同之处在于,服务器启动时就会实例化所有Filter,而Servlet中有当用户第一次访问它时才会被实例化。我们通过在web.xml使用对Filter配置的初始化参数,可以通过FilterConfig来获得。

Java过滤器Filter使用说明

Java 过滤器 1. 过滤器的产生背景 在基于JSP 页面开发的Web 项目中,会遇到一种情况,除了登陆页面或者注册页面以外,其它页面在用户未登陆的情况下是不允许访问的。对用户身份的验证是基于session 实现的,即在登陆成功后在session 中放入标识,当用户再次访问其它页面时,根据session 的标识来确认用户是否可以访问。这样的话,在很多页面中都需要添加判断代码,同样代码的重复增加了多余的代码,不符合Java 编程习惯且不利于维护。而过滤器的产生解决了这一问题。 2. 过滤器的实现 使用Servlet 过滤器实现JSP 页面中的用户身份验证,首先必须实现Filter 接口,且重写doFilter()方法,由doFilter()方法去处理过滤业务;其次,在web.xml 文件中配置Servlet 过滤器,指定过滤器的名称、过滤器包所在类的名称及过滤器的映射范围等。 3. 过滤器的介绍 3.1 Servlet 过滤器接口的构成 所有的Servlet 过滤器都必须实现javax.servlet.filter 接口,该接口中定义了3个过滤器必须实现的方法: void init(FilterConfig):过滤器的初始化方法,Servlet 容器在创建过滤器实例时调用这个方法,在这个方法中可以读出在web.xml 文件中为该过滤器配置的初始化参数。 void doFilter(ServletRequest,ServletResponse,FilterChain):用于完成实际的过滤操作,当客户请求访问与过滤器相关联的URL 时,Servlet 容器将先调用过滤器的这个方法,FilterChain 参数用于访问后续过滤器。 void destroy():过滤器在被取消前执行这个方法,释放过滤器申请的资源。 3.2创建一个Servlet 过滤器需要下面的步骤: 1.创建一个实现了javax.servlet.Filter 接口的类。 2.重写init(FilterConfig)方法,读入为过滤器配置的初始化参数,申请过滤器需要的资源 3.重写方法doFilter(ServletRequest,ServletResponse,FilterChain),完成过滤操作,可以从ServletRequest 参数中得到全部的请求信息,从ServletResponse 参数中得到全部的响应信息。 4.在doFilter()方法的最后,使用FilterChain 参数的doFilter()方法将请求和响应后传。 5.对响应的Servlet 程序和JSP 页面注册过滤器,在部署描述文件(web.xml)中使用元素对过滤器进行配置。 用户(浏览器) 服务器端页面 过滤器 请求 响应 服务器端

javaweb中的过滤器

day15 过滤器(Filter) 过滤器概述 1什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的。 当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“放行”,那么会继承执行用户请求的Servlet;如果Filter不“放行”,那么就不会执行用户请求的Servlet。 其实可以这样理解,当用户请求某个Servlet时,Tomcat会去执行注册在这个请求上的Filter,然后是否“放行”由Filter来决定。可以理解为,Filter来决定是否调用Servlet!当执行完成Servlet 的代码后,还会执行Filter后面的代码。 2过滤器之hello world 其实过滤器与Servlet很相似,我们回忆一下如果写的第一个Servlet应用!写一个类,实现Servlet

应该没有问题吧,都可以看懂吧! OK了,现在可以尝试去访问index.jsp页面了,看看是什么效果! 当用户访问index.jsp页面时,会执行HelloFilter的doFilter()方法!在我们的示例中,index.jsp 页面是不会被执行的,如果想执行index.jsp页面,那么我们需要放行!

有很多同学总是错误的认为,一个请求在给客户端输出之后就算是结束了,这是不对的!其实很多事情都需要在给客户端响应之后才能完成! 过滤器详细 1过滤器的生命周期 我们已经学习过Servlet的生命周期,那么Filter的生命周期也就没有什么难度了! ●init(FilterConfig):在服务器启动时会创建Filter实例,并且每个类型的Filter只创建一个实 例,从此不再创建!在创建完Filter实例后,会马上调用init()方法完成初始化工作,这个方法只会被执行一次; ●doFilter(ServletRequest req,ServletResponse res,FilterChain chain):这个方法会在用户每次访 问“目标资源(pattern>index.jsp)”时执行,如果需要“放行”,那么需要调用FilterChain的doFilter(ServletRequest,ServletResponse)方法,如果不调用FilterChain 的doFilter()方法,那么目标资源将无法执行; ●destroy():服务器会在创建Filter对象之后,把Filter放到缓存中一直使用,通常不会销毁 它。一般会在服务器关闭时销毁Filter对象,在销毁Filter对象之前,服务器会调用Filter 对象的destory()方法。 2FilterConfig 你已经看到了吧,Filter接口中的init()方法的参数类型为FilterConfig类型。它的功能与ServletConfig相似,与web.xml文件中的配置信息对应。下面是FilterConfig的功能介绍: ●ServletContext getServletContext():获取ServletContext的方法;

过滤器详解

使用filter过滤请求 注意 Filter虽然很常用,但是覆盖的范围太广,这里我们只介绍设置编码和控制权限的过滤器,其他的使用方式还需要大家自行积累。 如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章:第 8 章配置listener监听器。 1.了解Filter的使用。 7.1. 批量设置请求编码 编码问题会不会成为中国人学java的标志呢? 通过之前的讨论第 2.2.2 节“POST乱码”,我们知道为了避免提交数据的乱码问题,需要在每次使用请求之前设置编码格式。在你复制粘贴了无数次request.setCharacterEncoding("gb2312");后,有没有想要一劳永逸的方法呢?能不能一次性修改所有请求的编码呢? 用Filter吧,它的名字是过滤器,可以批量拦截修改servlet的请求和响应。 我们编写一个EncodingFilter.java,来批量设置请求编码。

在此EncodingFilter实现了Filter接口,Filter接口中定义的三个方法都要在EncodingFilter中实现,其中doFilter()的代码实现主要的功能:为请求设置gb2312编码并执行chain.doFilter()继续下面的操作。 与servlet相似,为了让filter发挥作用还需要在web.xml进行配置。 filter标签部分定义使用的过滤器,filter-mapping标签告诉服务器把哪些请求交给过滤器处理。这里的/*表示所有请求,/表示根路径,*(星号)代表所有请求,加在一起就变成了根路径下的所有请求。 这样,所有的请求都会先被EncodingFilter拦截,并在请求里设置上指定的gb2312编码。 例子在lingo-sample/07-01目录下,这次我们不需要在test.jsp中为请求设置编码也可以得到正常的中文参数了,EncodingFilter圆满的完成了它的工作。 7.2. 用filter控制用户访问权限 出于信息安全和其他一些原因的考虑,项目中的一些页面要求用户满足了一定条件之后才能访问。比如,让用户输入帐号和密码,如果输入的信息正确就在

使用Servlet过滤器验证Session

使用Servlet过滤器验证Session 登录模块至少需要以下几个页面: JSP模块: 1.输入用户信息页面(login.jsp); 2.登录成功欢迎页面(pass.jsp)(检查Session设置); 3.注销登录页面(logout.jsp)。 Servlet模块: 1.检查Cookie页面(index.mgc)(servlet:CheckCookie.java); 2.用户合法性验证页面(check.mgc)(servlet:CheckMember.java); Filter模块: 验证Session(SessionFilter.java); DAO模块: 1.VO对象类(Member.java); 2.数据库操作接口类(MemberDAO.java); 3.数据库连接类(DataBaseConnection.java); 4.数据库操作类(DAOMemberImpl.java); 5.工厂类(DAOFactory.java)。 数据库:member.mdb 结构图: --------------------------------------------------------------------- index.mgc | |判断Cookie中有无用户名、密码 ---------------------- | Y N | | V | login.jsp<-------------------- | |输入用户名、密码 | | V | ---------------->check.mgc | |调用DAO模块 | 查询数据库 V | member.mdb<--->DAO |

JAVA WEB 中Servlet过滤器的使用

JAVA WEB 中Servlet过滤器的使用 JAVA 2008-08-07 17:39:00 阅读175 评论0 字号:大中小订阅 一、Servlet过滤器的概念: Servlet过滤器是在Java Servlet规范2.3中定义的,它能够对Servlet容器的请求和响应对象进行检查和 修改。 Servlet过滤器本身并不产生请求和响应对象,它只能提供过滤作用。Servlet过期能够在Servlet被调用之前检查Request对象,修改Request Header和Request内容;在Servlet被调用之后检查Response对 象,修改Response Header和Response内容。 Servlet过期负责过滤的Web组件可以是Servlet、JSP或者HTML文件。 二、Servlet过滤器的特点: A.Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象 B.Servlet过滤器可以被指定和特定的URL关联,只有当客户请求访问该URL时,才会触发过滤器C.Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象 三、Servlet过滤器的作用: A.查询请求并作出相应的行动。 B.阻塞请求-响应对,使其不能进一步传递。 C.修改请求的头部和数据。用户可以提供自定义的请求。 D.修改响应的头部和数据。用户可以通过提供定制的响应版本实现。 E.与外部资源进行交互。 四、Servlet过滤器的适用场合: A.认证过滤 B.登录和审核过滤 C.图像转换过滤 D.数据压缩过滤 E.加密过滤 F.令牌过滤 G.资源访问触发事件过滤 H.XSL/T过滤 I.Mime-type过滤 五、Servlet过滤器接口的构成: 所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法: A.init(FilterConfig): 这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数 B.doFilter(ServletRequest,ServletResponse,FilterChain): 这个方法完成实际的过滤操作,当客户请求访问于过滤器关联的URL时,Servlet容器将先调用过滤器的

使用过滤器控制用户登录

学jsp这么长时间,做的项目也有七八个了,可所有的项目都是用户登录就直接跳转到其拥有权限的页面,或者显示可访问页面的链接。使用这种方式来幼稚地控制访问权限。从来没有想过如果我没有登录,直接输入地址也可以直接访问用户的页面的。 在jsp中权限的控制是通过Filter过滤器来实现的,所有的开发框架中都集成有Filter,如果不适用开发框架则有如下实现方法: LoginFilter.java public class LoginFilter implements Filter { private String permitUrls[] = null; private String gotoUrl = null; public void destroy() { // TODO Auto-generated method stub permitUrls = null; gotoUrl = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest res=(HttpServletRequest) request; HttpServletResponse resp=(HttpServletResponse)response;

if(!isPermitUrl(request)){ if(filterCurrUrl(request)){ System.out.println("--->请登录"); resp.sendRedirect(res.getContextPath()+gotoUrl); return; } } System.out.println("--->允许访问"); chain.doFilter(request, response); } public boolean filterCurrUrl(ServletRequest request){ boolean filter=false; HttpServletRequest res=(HttpServletRequest) request; User user =(User) res.getSession().getAttribute("user"); if(null==user) filter=true;

Filter过滤器详解

(牛人的经典教材) Java Filter过滤机制详解 一、什么是Filter Filter 技术是servlet 2.3 新增加的功能.servlet2.3是sun公司与2000年10月发布的,它的开发者包括许多个人和公司团体,充分体现了sun公司所倡导的代码开放性原则.由于众多的参与者的共同努力,servlet2.3比以往功能都强大了许多,而且性能也有了大幅提高. 它新增加的功能包括: 1. 应用程序生命周期事件控制; 2. 新的国际化; 3. 澄清了类的装载规则; 4. 新的错误及安全属性; 5. 不赞成使用HttpUtils 类; 6. 各种有用的方法; 7. 阐明并扩展了几个servlet DTD; 8. filter功能. 其中最重要的就是filter功能.它使用户可以改变一个request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链).一个filter 包括: 1. 在servlet被调用之前截获; 2. 在servlet被调用之前检查servlet request; 3. 根据需要修改request头和request数据; 4. 根据需要修改response头和response数据; 5. 在servlet被调用之后截获.

你能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用.几个实用的filter 包括:用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLT filter等. 一个filter必须实现javax.servlet.Filter接口定义的三个方法: doFilter、init 和destroy。(在三个方法在后面后有详细的介绍). 二、Filter体系结构 2.1、Filter工作原理(执行流程) 当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。 **************************************************************************************** ******************************** 在这里,我要插几句——关于过滤链的问题:上面说了,当一个请求符合某个过滤器的过滤条件时该请求就会交给这个过滤器去处理。那么当两个过滤器同时过滤一个请求时谁先谁后呢?这就涉及到了过滤链FilterChain。 所有的奥秘都在Filter的FilterChain中。服务器会按照web.xml中过滤器定义的先后循序组装成一条链,然后一次执行其中的doFilter()方法。(注:这一点Filter和Servlet是不一样的,具体请参看我的另一篇文章:Servlet和Filter 映射匹配原则之异同)执行的顺序就如下图所示,执行第一个过滤器的 chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码,请求的资源,第二个过滤器的chain.doFilter()之后的代码,第一个过滤器的 chain.doFilter()之后的代码,最后返回响应。

实验8 Servlet过滤器与监听器

https://www.360docs.net/doc/1114779029.html,/view/4636a813a2161479 1711280c.html 实验8 Servlet过滤器与监听器 第一部分 Servlet过滤器 一、实验目的 1. 了解过滤器的作用; 2. 掌握过滤器的开发与部署的步骤; 3. 了解过滤器链。 二、实验原理 过滤器是web服务器上的组件,它们对客户和资源之间的请求和响应进行过滤。 过滤器的工作原理是:当servlet容器接收到对某个资源的请求,它要检查是否有过滤器与之关联。如果有过滤器与该资源关联,servlet容器将把该请求发送给过滤器。在过滤器处理完请求后,它将做下面3件事: ?产生响应并将其返回给客户; ?如果有过滤器链,它将把(修改过或没有修改过)请求传递给下一个过滤器; ?将请求传递给不同的资源。 当请求返回到客户时,它是以相反的方向经过同一组过滤器返回。过滤器链中的每个过滤器够可能修改响应。 过滤器API主要包括:Filter、FilterConfig和FilterChain接口。 三、实验内容与步骤 (一)编写一个过滤器审计用户对资源的访问。 【步骤1】该过滤器实现的功能是,当用户访问应用程序任何资源时,将用户的IP地址和主机名写入日志文件中,过滤器代码如下: package filter; import java.io.IOException; import javax.servlet.*; import javax.servlet.http.*; public class AuditFilter implements Filter { protected FilterConfig config; public void init(FilterConfig filterConfig) throws ServletException { this.config = filterConfig; } public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {

servlet过滤器配置及运行过程

Servlet API的2.3版本的一个新功能就是能够为servlet和JSP页面定义过滤器。过滤器提供了某些早期服务器所支持的非标准“servlet链接”的一种功能强大且标准的替代品。 过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择: 以常规的方式调用资源(即,调用servlet或JSP页面)。 利用修改过的请求信息调用资源。 调用资源,但在发送响应到客户机前对其进行修改。 阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。 过滤器只在与servlet规范2.3版兼容的服务器上有作用。如果你的Web应用需要支持旧版服务器,就不能使用过滤器。 1.建立基本过滤器 建立一个过滤器涉及下列五个步骤: 1)建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。doFilter 方法包含主要的过滤代码(见第2步),init方法建立设置操作,而destroy方法进行清楚。 2)在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过滤器中忽略此参数。最后一个参数为 FilterChain,如下一步所述,此参数用来调用servlet或JSP页。 3)调用FilterChain对象的doFilter方法。 Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。 4)对相应的servlet和JSP页面注册过滤器。在部署描述符文件(web.xml)中使用filter和 filter-mapping元素。 5)禁用激活器servlet。防止用户利用缺省servlet URL绕过过滤器设置。 1.1 建立一个实现Filter接口的类 所有过滤器都必须实现javax.servlet.Filter。这个接口包含三个方法,分别为doFilter、init和destroy。 1、public void doFilter(ServletRequset request, ServletResponse response, FilterChain chain) thows ServletException, IOException 每当调用一个过滤器(即,每次请求与此过滤器相关的servlet或JSP页面)时,就执行其doFilter 方法。正是这个方法包含了大部分过滤逻辑。 第一个参数为与传入请求有关的ServletRequest。对于简单的过滤器,大多数过滤逻辑是基于这个对象的。如果处理HTTP请求,并且需要访问诸如 getHeader或getCookies等在ServletRequest中无法得到的方法,就要把此对象构造成 HttpServletRequest。 第二个参数为ServletResponse。除了在两个情形下要使用它以外,通常忽略这个参数。首先,如果希望完全阻塞对相关servlet或JSP页面的访问。可调用response.getWriter并直接发送一个响应到客户机。第7节给出详细内容,第8节给出一个例子。其次,如果希望修改相关的servlet或JSP 页面的输出,可把响应包含在一个收集所有发送到它的输出的对象中。然后,在调用 serlvet或JSP 页面后,过滤器可检查输出,如果合适就修改它,之后发送到客户机。详情请参阅第9节。 DoFilter的最后一个参数为FilterChain对象。对此对象调用doFilter以激活与servlet或JSP页面相关的下一个过滤器。如果没有另一个相关的过滤器,则对doFilter的调用激活servlet或JSP本身。 2、public void init(FilterConfig config) thows ServletException init 方法只在此过滤器第一次初始化时执行,不是每次调用过滤器都执行它。对于简单的过滤器,

java过滤器应用

1:Servletf过虑器基础: Servlet过滤器是Servlet的一种特殊用法,主要用来完成一些通用的操作。比如编码的过滤,判断用户的登陆状态等等。Servlet过虑的适用场合: A.认证过滤 B.登录和审核过滤 C.图像转换过滤 D.数据压缩过滤 E.加密过滤 F.令牌过滤 G.资源访问触发事件过滤 Servlet过滤器接口的构成: 所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法: 方法说明 init(FilterConfig cfg)这是Servlet过滤器的初始化方法,性质等同与servlet的init方法。doFilter(ServletRequest,ServletResponse,FilterChain)完成实际的过滤操作,当请求访问过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器 Destroy()Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源。性质等同与servlet的destory()方法。 Servlet过滤器创建步骤: A.实现javax.servlet.Filter接口的servlet类 B.实现init方法,读取过滤器的初始化函数。 C.实现doFilter方法。完成对请求或过滤的响应 D.调用FilterChain接口对像的doFilter方法,向后续的过滤器传递请求或响应 E.在web.xml中配置Filter 2.使用过滤器处理中文问题 3.使用过滤器认证用户: 每个过滤器也可以配置初始化参数,可以将不需要过滤的地址配置到这个Filter的配置参数中,过滤时,如果请求地址在配置参数中,则放行,这样避免了在程序中硬编码。每个Filter 中初始化时,都可以得到配置对象,在Filter中配置二个不需要过滤的地址,一个是登陆页面,一个是执行登陆认证的Servlet 示例: Public class EncodingFilter implements Filter{ Private static String encoding; Public void destroy(){ System.out.println(“过滤器被销毁!!!!!”);//WEB应用被卸载时,过滤器即被销毁。 } Public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServletException{ System.out.println(“step1^^^^^^^^^^^^^); request.setCharacterEncoding(encoding); chain.doFilter(request,response); System.out.println(“step2^^^^^^^^^^^^^^^^^^^^^^^^^^^^^”);

相关主题
相关文档
最新文档