实验8 Servlet过滤器与监听器

合集下载

过滤器与监听器

过滤器与监听器

Servlet监听器
1、概念: Servlet监听器是当今Web应用开发的一个重要组成部分。Servlet监听器主 要目的是给 Web应用增加事件处理机制,以便更好地监视和控制Web应用的状 态变化,从而在后台调用相应处理程序 2、常见的Servlet监听器如下:
监听对象 ServletRequest HttpSession 监听接口 ServletRequestListener 监听事件 ServletRequestEvent
ServletContext
ServletContextListener
ServletContextAttributeListener
ServletContextEvent
ServletContextAttributeEvent
” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他 们就是为windows写程序,而不是为Sun的设备写程序” ——Scott McNealy(Sun首席执行官)
第五课
过滤器与监听器
” 如果十年前Sun没有做Java,人们便会写.Net程序,如果他们写.Net程序,他 们就是为windows写程序,而不是为Sun的设备写程序” ——Scott McNealy(Sun首席执行官)

提问
• • • Session与Request有哪些区别?

Session被关闭的可能原因有哪些? Session的默认超时时间是多少,Session的最大空闲时间有哪两种 设置方式?
<filter-mapping> <filter-name>过滤器名</filter-name> <url-pattern>/文件名/*</url-pattern> </filter-mapping>

servlet过滤器和监听器

servlet过滤器和监听器

Servlet监听器类型 (2)
ServletContext事件监听器中的接口和方法如表所示:
接口名称
方法名称
描述
ServletContextAttribut eListener
ServletContextListener
attributeAdded( ServletContextAttributeEvent scae) attributeRemoved( ServletContextAttributeEvent scae)
Servlet过滤器的特点
• Servlet过滤器可以检查和修改 ServletRequest和ServletResponse对象。
• Servlet过滤器可以被指定和特定的URL关联, 只有当客户请求访问该URL时,才会触发过滤 器。
• Servlet过滤器可以被串联在一起,形成管道 效应,协同修改请求和响应对象。
• 当用用户登陆页面输入帐号时,如果输 入是中文,后台servlet再次输出这个内 容时,可能就会是乱码,这是因为 serlvet中默认是以ISO-8859-1格式编 码的,如果后台有多个Servlet, 我们可 以通过一个过滤器统一解决,使后台的 输出输出都支持中文!将ISO-8859-1 转码为GBK的那段代码!
Servlet过滤器典型应用 (6)
(4)运行结果: 当IP地址非192.168.70.82的用户访问success.jsp时,运行结果
如图1所示:
图1 当IP地址非192.168.70.82的用户访问success.jsp时,运行结果 如图2所示:
图2
Servlet监听器
Servlet监听器工作原理 Servlet监听器类型 Servlet监听器典型应用

详解Servlet之过滤器(Filter)

详解Servlet之过滤器(Filter)

详解Servlet之过滤器(Filter)过滤器1.为什么使⽤它?有很多全站性的东西需要处理,例如乱码问题,通过过滤器统⼀进⾏过滤更简单2.有什么⽤?实现⽤户在访问某个⽬标资源之前,对访问的请求和响应进⾏拦截。

简单说,就是可以实现web容器对某资源的访问前截获进⾏相关的处理,还可以在某资源向web容器返回响应前进⾏截获进⾏处理。

3.怎么⽤?步骤1:先写⼀个类实现javax.servlet.Filter接⼝步骤2:重写抽象⽅法步骤3:在doFilter()⽅法中写处理代码,最后⽤FilterChain调⽤FilterChain.doFilter(req, resp)⽅法,表⽰可以执⾏后⾯的拦截器(如果有的话)步骤3:进⾏配置,web.xml配置如下<!-- 优先配置过滤器 ,过滤器应该在Servlet前⾯配置,并且过滤器之间有顺序 --><filter><filter-name>firstfilter</filter-name><filter-class>cn.hk.filter.FirstFilter</filter-class></filter><filter-mapping><filter-name>firstfilter</filter-name><!-- 拦截访问资源*表⽰拦截所以资源--><url-pattern>/*</url-pattern></filter-mapping>4运⽤的场景?1)实现URL级别的权限访问控制;2)处理全站中⽂乱码问题;3)实现⾃动登录;4)过滤敏感词汇;5)压缩⽹页;6)选择性让浏览器缓存;等等。

这⼏种功能的实现采⽤同样的原理,那就是使⽤包装模式或动态代理增强request或response对象的功能。

Servlet过滤器

Servlet过滤器

使用Filter实现URL级别的权限认证
情景:在实际开发中我们经常把一些执行敏感操
作的servlet映射到一些特殊目录中,并用filter把这 些特殊目录保护起来,限制只能拥有相应访问权限 的用户才能访问这些目录下的资源。从而在我们系 统中实现一种URL级别的权限功能。 要求:为使Filter具有通用性,Filter保护的资源和 相应的访问权限通过filter参数的形式Filter示例
<filter-mapping> <filter-name>testFilter</filter-name> <url-pattern>/test.jsp</url-pattern> </filter-mapping>
<filter-mapping> <filter-name>testFilter</filter-name> <url-pattern>/index.jsp</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
Tip:Filter简介

Servlet API中提供了一个Filter接口,开发web应用时,如果编写 的Java类实现了这个接口,则把这个java类称之为过滤器Filter。 通过Filter技术,开发人员可以实现用户在访问某个目标资源之前, 对访问的请求和响应进行拦截,如下所示:
Web浏览器
Tip: FilterConfig接口

Servlet进阶API与过滤器与监听器

Servlet进阶API与过滤器与监听器

Servlet进阶API、过滤器与监听器1、Servlet进阶API每个Servlet都必须由web容器读取Servlet设置信息(无论使用标注还是web.xml)、初始化等,才可以真正成为一个Servlet。

对于每个Servlet的设置信息,web容器会为其生成一个ServletConfig作为代表对象,你可以从该对象取得Servlet初始参数,以及代表整个web应用程序的ServletContext对象。

1.Servlet、ServletConfig与GenericServlet在Servlet接口上,定义了与Servlet生命周期及请求服务相关的init()、service()与destroy()三个方法。

每一次请求来到容器时,会产生HttpServletResponse与HttpServletResponse对象,并在调用service()方法时当作参数传入。

在Web容器启动后,会读取Servlet设置信息,将Servlet类加载并实例化,并为每个Servlet设置信息产生一个Servletconfig对象,而后调用Servlet接口的init()方法并将发生的ServletConfig对象当作参数传入。

这个过程只会在创建Servlet实例后发生一次。

ServletConfig即每个Servlet设置的代表对象,容器会为每个Servlet设置信息产生一个Servlet及ServletConfig实例。

GenericServlet同时实现了Servlet及Servlet-Config。

GenericServlet主要的目的,就是将初始Servlet调用init()方法传入的ServletConfig封装起来:private transient ServletConfig config;public void init(SetvletConfig config)throws ServletException{this,config = config;this.init();}public void init()throws ServletException{}GenericServlet在实现Servlet的init()方法时,也调用了另一个无参数的init()方法,在编写Servlet时,如果有一些初始时所要运行的动作,可以重新定义这个无参数的init()方法,而不是直接重新定义有ServletConfig参数的init()方法。

过滤器和监听器

过滤器和监听器

案例1:统一设置字符集案例2:拦截URL,不登录不允许直接访问页面监听器监听器顾名思义就是监听某种事件的发生,即当某个事件发生时,就触发了某个设置好的监听器,但是这里触发的原因不同。

例如地震监测仪器监听地震的发生,大气监测仪,监测空气的变化以提供预警。

在servlet中因监听对象的不同也分为不同的监听器,这里指的监听对象是application、session对象,每种对象有各自的监听器。

1.application监听器:ServletContextListener需要实现的方法:(1)public void contextInitialized(ServletContextEvent e); //在application创建时就调用(2)public void contextDestroyed(ServletContextEvent e); //当application销毁时调用ServletContextEvent的getServletContext()方法可以取得application对象;创建完成监听器后需要在web.xml中做如下配置标签是单独出现的包含一个子标签,指定了监听类的全称(包名+类名)2.application属性监听器:ServletContextAttributeListener需要实现的方法:(1)public void attributeAdded(ServletContextAttributeEvent e); //当调用application.setAttribute()时调用(2)public void attributeRemoved(ServletContextAttributeEvent e); //当调用applcaition.removeAttribute()时调用(3)public void attributeReplaced(ServletContextAttributeEvent e); //当调用两次application.setAttribute()赋予相同属性时调用参数ServletContextAttributeEvent可以获得触发该监听器的属性名称和属性值,方法有:(1)getName(); 取得属性的名称;(2)getValue(); 取得属性的值;(注意:返回的是Object,必须转型)3.session监听器:HttpSessionListener需要实现的方法:(1)public void sessionCreated(HttpSessionEvent e); //当打开一个浏览器时,就会触发这个方法;(2)public void sessionDestroyed(HttpSessionEvent e); //当调用session.invalidate();或超时时调用HttpSessionEvent的方法getSession()获得触发监听器的session对象;销毁session常用的有2种方式:(1)session.invalidate();//直接销毁(2)在web.xml中设置超时时间://所有session起作用<session-config><session-timeout>5</session-timeout><!-- 5分钟 --></session-config>注意:如果会话超时时间设置为-1,则表示会话永远不会超时;4.session属性监听器:HttpSessionAttributeListener需要实现的方法:(1)public void attributeAdded(HttpSessionBindingEvent e); //当调用session.setAttribute()时调用(2)public void attributeRemoved(HttpSessionBindingEvent e); //当调用session.removeAttribute()时调用(3)public void attributeReplaced(HttpSessionBindingEvent e); //当调用两次session.setAttribute()赋予相同属性时调用HttpSessionBindingEvent 方法:(1)getSession();//获取触发监听器的session(2)getName();//获取属性名称(3)getValue();//获取属性值监听器应用场景 ServletContextListener:在任何Servlet提供服务之前执行、在Servlet销毁时执行,用于提前初始化一些资源,比如数据库连接、销毁一些资源,比如数据库连接;ServletContextAttributeListener:上下文中添加、删除、替换了属性;HttpSessionListener:多少个在线用户,即跟踪会话;HttpSessionAttributeListener:会话属性添加、删除、替换;综合案例:做一个网站在线人数统计,可以通过ServletContextListener监听,当Web应用上下文启动时,在ServletContext中添加一个List.用来准备存放在线的用户名,然后通过HttpSessionAttributeListener监听,当用户登录成功,把用户名设置到Session中。

第9章使用Servlet过滤器和监听器

第9章使用Servlet过滤器和监听器

public String getInitParamter(String name)


public Enumeration getInitParamterNames()


public ServletContext getServletContext()

9.1.5 FilterChain接口


在过滤器中处理的ServletRequest和ServletResponse对象,最终要传 递到被过滤的Servlet或JSP

在doFilter方法中可以通过对ServletRequest的操作在Servlet运行 之前改变Web请求的头信息或内容,通过对ServletResponse的 操作在Servlet运行之后改变响应结果。
提供 HttpServletResponse 接口的便捷实现,希望根据 Servlet 适配响应的开发 人员可以子类化该接口。此类实现 Wrapper 或 Decorator 模式。 默认情况下,方法通过包装的响应对象调用。
过滤器生命周期

过滤器生命周期的各个阶段:
实例化
初始化 过滤 销毁
9.1.3 Filter接口
1. <filter> 2. <filter-name>LogonFilter</filter-name> 3. <filter-class>com.LogonFilter</filter-class> 4. 5. <init-param> 6. <param-name>logon_uri</param-name> 7. <param-value>/logon.jsp</param-value> 8. </init-param> 9. <init-param> 10. <param-name>home_uri</param-name> 11. <param-value>/home.jsp</param-value> 12. </init-param> 13. </filter>

Java Web开发与实践第8章04 Servlet监听器

Java Web开发与实践第8章04  Servlet监听器
器 是 当 今 Web 应 用 开 发 的 一 个 重 要 组 成 部 分 。 它 是 在 Servlet2.3规范中和Servlet过滤器一起引入的,并且在Servlet 2.4规范 中对其进行了较大的改进,主要就是用来对Web应用进行监听和控制的, 极大地增强了Web应用的事件处理能力。 Servlet监听器的功能比 较 接近Java 的GUI程序的监听器,可以监听由于 Web应用中状态改变而引起的Servlet容器产生的相应事件,然后接受并 处理这些事件。
Servlet请求监听
在Servlet 2.4规范中,新增加了一个技术,就是可以监听客户端的请求。 一旦能够在监听程序中获取客户端的请求,就可以对请求进行统一处理。要 实现客户端的请求和请求参数设置的监听需要实现两个接口。 1.ServletRequestListener接口 2.ServletRequestAttributeListener接口
Listener 接口 ServletContextListener ServletContextAttributeListener HttpSessionListener HttpSessionActivationListener HttpSessionAttributeListener HttpSessionBindingListener ServletRequestListener ServletRequestAttributeListener ServletContextEvent ServletContextAttributeEvent HttpSessionEvent HttpSessionBindingEvent ServletRequestEvent ServletRequestAttributeEvent Event 类

第8章 过滤器与监听器-基于Eclipse平台的JSP应用教程(第2版)-陈恒-清华大学出版社

第8章 过滤器与监听器-基于Eclipse平台的JSP应用教程(第2版)-陈恒-清华大学出版社
如果执行了该语句,就会执行下一个过滤器,如果没 有下一个过滤器,就返回请求目标程序。如果因为某个原 因没有执行“chain.doFilter(request, response);”, 则请求就不会继续交给以后的过滤器或请求目标程序,这 就是所谓的拦截请求。
无限挑战 无限飞翔
基于Eclipse平台的JSP应用教程
@WebFilter用于将一个类声明为过滤器,该注解将会 在部署时被容器处理,容器将根据具体的属性配置,将相 应的类部署为过滤器。
见【例8-2】
无限挑战 无限飞翔
基于Eclipse平台的JSP应用教程
清华大学出版社
8.2.3 过滤器的执行顺序
过滤器拦截路径相同时,首先按照<filter-mapping> 标记在web.xml中出现的先后顺序执行过滤器,然后再按 照过滤器类名的字典顺序执行注解的过滤器。
</filter> <filter-mapping>
<filter-name>firstFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 只要用户请求的URL和<filter-mapping>的子标记<urlpattern>指定的模式匹配的话,Web服务器就会自动调用该Filter的 doFilter()方法。如8.1节中的FirstFilter过滤器在web.xml中的 <url-pattern>指定值为/*,“/*”代表任何页面或Servlet的请求。
该方法的功能是初始化过滤器对象。如果为过滤器设 置了初始参数,则可以通过FilterConfig的 getInitParameter(String paramName)方法获得初始参数 值。

聊聊java过滤器、监听器、拦截器的区别(终结篇)

聊聊java过滤器、监听器、拦截器的区别(终结篇)

聊聊java过滤器、监听器、拦截器的区别(终结篇)过滤器、监听器、拦截器概念概念1、servlet:servlet是⼀种运⾏服务器端的java应⽤程序,具有独⽴于平台和协议的特性,可以动态⽣成web页⾯它⼯作在客户端请求与服务器响应的中间层;2、filter:filter是⼀个可以复⽤的代码⽚段,可以⽤来转换HTTP请求,响应和头信息。

它不能产⽣⼀个请求或者响应,它只是修改对某⼀资源的请求或者响应;3、listener:监听器,通过listener可以坚挺web服务器中某⼀执⾏动作,并根据其要求作出相应的响应。

就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时⾃动执⾏代码的功能组件;4、interceptor:拦截器是对过滤器更加细化的应⽤,他不仅可以应⽤在service⽅法前后还可以应⽤到其他⽅法的前后拦截器;5、servlet,filter,listener是配置到web.xml中,interceptor不配置到web.xml中,struts的拦截器配置到struts。

xml中。

spring的拦截器配置到spring.xml中;过滤器和拦截器的区别先说最易混淆的过滤器和拦截器的区别:1、拦截器是基于java的反射机制的,⽽过滤器是基于函数回调。

2、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

3、拦截器只能对action请求起作⽤,⽽过滤器则可以对⼏乎所有的请求起作⽤。

4、拦截器可以访问action上下⽂、值栈⾥的对象,⽽过滤器不能访问。

5、在action的⽣命周期中,拦截器可以多次被调⽤,⽽过滤器只能在容器初始化时被调⽤⼀次。

6、拦截器可以获取IOC容器中的各个bean,⽽过滤器就不⾏,这点很重要,在拦截器⾥注⼊⼀个service,可以调⽤业务逻辑。

过滤器、监听器、拦截器的⽣命周期1、servletservle的⽣命周期开始于被装⼊web服务器的内存中,并在web服务终⽌或者重新装⼊servlet的时候结束;servlet⼀旦被装⼊web服务器,⼀般不会从web服务器内存中删除;直到web服务器关闭;装⼊:启动服务器时加载servlet的实例;初始化:web服务器接收到请求时,或者两者之间的某个时刻启动,调⽤init()调⽤:从第⼀次到以后的多次访问,都只调⽤doGet()或dopost)()⽅法;销毁;停⽌服务器时调⽤destroy()⽅法,销毁实例;2、filter需要实现javax.servlet包的Filter接⼝的三个⽅法init(),doFilter(),destroy();加载:启动服务器时加载过滤器的实例,并调⽤init()⽅法;调⽤:每次请求的时候只调⽤⽅法doFilter()进⾏处理;销毁:服务器关闭前调⽤destroy()⽅法,销毁实例;3、listenerweb.xml的加载顺序是:context-param->listener->filter->servlet4、interceptor加载配置⽂件后初始化拦截器,当有对action的请求的时候,调⽤interceptor⽅法,最后也是根据服务器停⽌进⾏销毁;过滤器、监听器、拦截器的职责1、servlet创建并返回⼀个包含基于客户请求性质的动态内容的完整的html页⾯创建可嵌⼊到现有的html页⾯中的⼀部分html页⾯(html⽚段)读取客户端发来的隐藏数据读取客户端发来的显⽰数据与其他服务器资源(包括数据库和java的应⽤程序)进⾏通信2、filterfilter能够在⼀个请求到达servlet之前预处理⽤户请求,也可以在离开servlet时处理http响应:在执⾏servlet之前,⾸先执⾏filter程序,并为之做⼀些预处理⼯作;在servlet被调⽤之后截获servlet的执⾏3、listenerservlet2.4规范提供了8个listener接⼝,可以将其分为三类,分别如下;第⼀类:与HttpContext有关的listener接⼝,包括:ServletContextListener、ServletContextAttributeListener第⼆类:与HttpSession有关的listner接⼝。

servlet过滤器和监听器

servlet过滤器和监听器

忽略此参数;最后一个参数为 FilterChain,该参数用来调
用过滤 器链中的下一个资源。FilterChain参数用于访问后续 过滤器
destroy():Servlet容器在销毁过滤器实例前调用该方法 ,这个方法中可以释放Servlet过滤器占用的资源。性质等同 与servlet的destory()方法。
doFilter(ServletRequest
reg,
ServletResponse
res,FilterChain chain):
用于进行过滤操作,该方法的第一个参数为
ServletRequest对象, 此对象给过滤器提供了对进入的信息( 包括表单数据、Cookie和
HTTP 请 求 头 ) 的 完 全 访 问 ; 第 二 个 参 数 为 ServletResponse,用于 响应使用ServletRequest对象访问的信 息,通常在简单的过滤器中
•Servlet过滤器
•filterConfig=null; •(3)创建JSP页面“online. •3.ServletRequest事件监听器
•redirectPort="8443" •Servlet监听器工作原理 •<title>拒绝访问</title>
•<Connector port="8080" protocol="HTTP/1. •HttpSessionListener用于监听HttpSession对象的改变,例如HttpSession对象的创建与销毁,HttpSessionActivationListener用 于监听HttpSession对象的状态,例如HttpSession对象是被激活还是被钝化。 •在方法中,若需要获取客户端请求相关的信息,则访问方法的第一个参数(HttpServletRequest类型),若需要发回给客户端响应 信息,则利用方法的第二个参数(HttpServletResponse类型)。 •HttpSessionBindingListener用于监听HttpSession对象的绑定状态,例如添加对象和移除对象。 •ServletContext事件监听器中的接口和方法如表所示: •欢迎访问吉林省三扬科技咨询有限

Servlet中的过滤器(拦截器)Filter与监听器Listener的作用和区别

Servlet中的过滤器(拦截器)Filter与监听器Listener的作用和区别

Servlet中的过滤器(拦截器)Filter与监听器Listener的作用和区别Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。

其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。

它是随你的web 应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁,以下通过过滤编码的代码示例来了解它的使用:以下是 MyCharsetFilter.java 在web.xml 中配置:以上的例子简单的说明了Filter的使用,具体其他的应用可以看具体的场景。

现在来说说Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。

主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。

下面利用监听器对数据库连接池DataSource的初始化演示它的使用:web.xml中配置如下,很简单:这样配置好了之后,以后在web应用中就可以通过ServletContext取得BasicDataSource对象,从而获取与数据库的连接,提高性能,方便使用。

上面通过两个示例演示了Filter和Listener的基本使用,对于其它的应用则需要我们在项目开发中根据具体的场景选择。

多多去挖掘。

Servlet事件监听器

Servlet事件监听器

序一、概念监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。

二、Servle监听器1、编写 Servlet监听器(1)和编写其它事件监听器一样,编写servlet监听器也需要实现一个特定的接口,并针对相应动作覆盖接口中的相应方法。

(2)和其它事件监听器略有不同的是,servlet监听器的注册不是直接注册在事件源上,而是由WEB容器负责注册,开发人员只需在web.xml文件中使用<listener>标签配置好监听器,web容器就会自动把监听器注册到事件源中。

(3)一个 web.xml文件中可以配置多个 Servlet 事件监听器,web服务器按照它们在web.xml 文件中的注册顺序来加载和注册这些 Serlvet事件监听器。

2、在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext, HttpSession和ServletRequest这三个域对象。

(1)监听servletContext域对象创建和销毁①ServletContextListener接口用于监听 ServletContext 对象的创建和销毁事件。

ⅰ当 ServletContext对象被创建时,激发contextInitialized (ServletContextEvent sce)方法ⅱ当 ServletContext对象被销毁时,激发contextDestroyed(ServletContextEvent sce)方法。

②servletContext域对象何时创建和销毁:ⅰ创建:服务器启动针对每一个web应用创建servletcontextⅱ销毁:服务器关闭前先关闭代表每一个web应用的servletContext(2)监听HttpSession域对象创建和销毁①HttpSessionListener接口用于监听HttpSession创建和销毁ⅰ创建一个Session时,sessionCreated(HttpSessionEventse)方法将会被调用。

过滤器、监听器、上下文、servlet线程安全问题

过滤器、监听器、上下文、servlet线程安全问题

过滤器、监听器、上下文、servlet线程安全问题过滤器:什么是过滤器:servlet规范当中定义的一种特殊的组件,用来拦截servlet容器的调用过程。

会先调过过滤器的方法,过滤器决定是否向后继续调用就是调用servlet容器容器收到请求之后通常情况下会调用servlet的service方法来处理请求。

如果有过滤器,则容器先调用过滤器的方法如何写一个过滤器:1、写一个Java类,实现接口Filter2、在doFilter方法里面,编写拦截处理逻辑3、配置过滤器(web.xml) 让容器知道哪些请求需要拦截比如写一个评论,然后显示出来。

但是说一些敏感字。

就不允许其评论但是已经写完了的话,评论与后端的servlet的话。

可以直接加个过滤器容器只要一启动,就会立即创建过滤对象。

只会创建一个。

容器在创建过滤器对象之后会调用该对象的init方法。

该方法只会执行一次。

容器调用doFilter方法来处理请求FilterChain(过滤器链)过滤器CommentFilterApackage web;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class CommentFilterA implements Filter {public void destroy() {// TODO Auto-generated method stub}//容器会将request和response作为参数传递过来。

Servlet中的过滤器(拦截器)Filter与监听器Listener的作用和区别

Servlet中的过滤器(拦截器)Filter与监听器Listener的作用和区别

Servlet中的过滤器(拦截器)Filter与监听器Listener的作用和区别1. 过滤器(Filter)的作用和用途:过滤器用于截取请求和响应,可以在请求到达目标资源之前预处理请求,也可以在响应返回给客户端之前对响应进行处理。

过滤器可以对请求和响应进行统一的处理,例如验证用户的登录状态、设置字符编码、限制请求的访问等。

过滤器的主要特点:- 过滤器的配置和初始化是在web.xml文件中进行的。

-过滤器可以通过设置多个过滤器链来实现不同的目的。

-过滤器可以通过链式调用的方式实现多个过滤器的集成。

-过滤器可以修改请求的参数、头部信息或者重定向到其他资源。

2. 监听器(Listener)的作用和用途:监听器用于监听Servlet中发生的事件和动作,并作出相应的处理。

监听器可以监听到Web应用的生命周期事件(如应用的启动和关闭)、会话的创建和销毁事件、请求的到达和离开等。

通过监听Servlet的事件,可以在事件发生前、发生后或者发生中进行相关操作,用于处理这些事件。

监听器的主要特点:-监听器可以通过注解或者配置文件的方式进行配置和初始化。

-监听器可以监听多个事件,根据事件的类型进行不同的处理。

-监听器可以访问和修改请求和响应对象。

-监听器可以获取到应用的初始化参数、会话信息等。

区别:- 过滤器(Filter)主要用于拦截请求和响应,可以对其进行预处理和后处理,常用于权限验证、请求包装、字符编码设置和URL重定向等。

而监听器(Listener)主要用于监听特定的事件和动作,常用于记录日志、统计在线人数、初始化和销毁操作等。

- 过滤器是在Servlet调用之前进行处理,通过链式调用的方式实现多个过滤器的集成。

而监听器是在Servlet处理过程中监听特定事件的发生,对事件进行相应的处理。

-过滤器可以修改请求和响应对象,而监听器只能获取和监听这些对象。

-过滤器可以针对多个URL进行配置,而监听器是全局的,对整个应用进行监听。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验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 {HttpServletRequest req = (HttpServletRequest)request;HttpServletResponse res = (HttpServletResponse)response;String addr = req.getRemoteAddr();String user = req.getRemoteHost();config.getServletContext().log("RemoteAddress:"+addr+",RemoteHost:"+user);chain.doFilter(req, res);}public void destroy() {}}【步骤2】配置过滤器。

在部署描述文件web.xml中配置过滤器:<filter><filter-name>AuditFilter</filter-name><filter-class>filter. AuditFilter</filter-class></filter><filter-mapping><filter-name>AuditFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>上述代码中过滤器映射使用的URL模式为/*,这表示将该过滤器映射到Web应用程序的任何资源。

如果只对某些资源(如JSP页面审计,则可以指定具体的资源)。

【步骤3】访问该应用程序中的任何一个资源,如使用下面的URL访问onlineCount.jsp:http://localhost:8080/ helloapp/onlineCount.jsp然后打开<CATALINA_HOME>\logs目录中的localhost.2006-02-05.log文件中有下面一行(访问多个资源就会有多行):信息: RemoteAddress:127.0.0.1,RemoteHost:127.0.0.1新建一个jsp文件MyJsp1.jsp 在旧的jsp里输入:<body>This is my JSP page. <br><a href="MyJsp1.jsp">send</a></body>(二)编写一个过滤器改变请求编码。

【步骤1】编写一个loginform.html文件,代码如下:<html><head><title>使用过滤器改变请求编码</title><meta http-equiv="Content-Type" content="text/html;charset=GB2312"></head><body><center><h2>请输入用户名和口令:</h2><form method="post" action="servlet/check"><table><tr><td>用户名:</td><td><input name="name" type="text"></td></tr><tr><td>口令:</td><td><input name="pass" type="password"></td></tr><tr><td></td><td><input name="ok" type="submit" value="提交"><input name="cancel" type="reset" value="重置"></td></tr></table></form></center></body></html>【步骤2】编写处理请求参数的Servlet,代码如下:import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class CheckParamServlet extends HttpServlet{public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {String name = request.getParameter("name");String pass = request.getParameter("pass");response.setContentType("text/html;charset=gb2312");PrintWriter out = response.getWriter();out.println("<html><head><title>Param Test</title></head>");out.println("<h3 align=center>你的用户名为:"+name+"</h3>");out.println("<h3 align=center>你的口令为:"+pass+"</h3>");out.println("</body></html>");}public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {doGet(request,response);}}【步骤3】修改web.xml文件,加入下面代码:<servlet><servlet-name>CheckParamServlet</servlet-name><servlet-class>CheckParamServlet</servlet-class></servlet><servlet-mapping><servlet-name>CheckParamServlet</servlet-name><url-pattern>/servlet/check</url-pattern></servlet-mapping>【步骤4】在浏览器的地址栏中输入下面URL:http://localhost:8080/ helloapp/loginform.html输入用户名和口令,如下图所示:loginform.html页面的运行结果然后点击“提交”按钮,经CheckParamServlet处理后返回的结果如下图所示::CheckParamServlet 程序的运行结果从这里我们可以看到,从服务器返回的汉字成了乱码。

原因是没有指定request的编码。

下面通过编写一个过滤器改变请求编码。

【步骤5】过滤器代码如下:package filter;import java.io.IOException;import javax.servlet.*;public class EncodingFilter implements Filter {protected String encoding = null;protected FilterConfig config;public void init(FilterConfig filterConfig) throws ServletException {this.config = filterConfig;// 得到在web.xml中配置的编码this.encoding = filterConfig.getInitParameter("Encoding");}public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException, ServletException {if (request.getCharacterEncoding() == null) {// 得到指定的编码String encode = getEncoding();if (encode != null) {//设置request的编码request.setCharacterEncoding(encode);response.setCharacterEncoding(encode);}}chain.doFilter(request, response);}protected String getEncoding() {return encoding;}public void destroy() {}}【步骤6】在web.xml文件中配置过滤器,加入下面代码:<filter><filter-name>EncodingFilter</filter-name><filter-class>filter.EncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>gb2312</param-value></init-param></filter><filter-mapping><filter-name>EncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>【步骤7】重复第(4)步操作,结果如下:EncodingFilter 程序的运行结果四、思考题1. 试简述过滤器有哪些功能?2. 如何理解过滤器链。

相关文档
最新文档