servlet filter listener 含义

Servlet规范中定义,默认情况下(Servlet不是在分布式的环境中部署),Servlet容器对声明的每一个Servlet,只创建一个实例。如果有多个客户端请求同时访问这个Servlet,Servlet容器如何处理多个请求呢?答案是采用多线程,Servlet容器维护一个线程池来服务请求。当容器接收到一个访问Servlet的请求,调度者线程从线程池中选取一个工作线程,将请求传递给该线程,然后由这个线程执行Servlet的service()方法。

线程安全的Servlet
变量的线程安全

因为Servlet是单实例多线程模型,多个线程共享一个Servlet实例,因此对于实例变量的访问是非线程安全的。

建议:在Servlet中尽可能的使用局部变量,应该只使用只读的实例变量和静态变量。如果非得使用共享的实例变量或静态变量,在修改共享变量时应该注意线程同步。

属性的线程安全

在Servlet中,可以访问保存在ServletContext、HttpSession和ServletRequest对象中的属性。那么这三种不同范围的对象,属性访问是否是线程安全的呢?

ServletContext:该对象被Web应用程序的所有Servlet共享,多线程环境下肯定是非线程安全的。

HttpSession:HttpSession对象只能在同属于一个Session的请求线程中共享。对于同一个Session,我们可能会认为在同一时刻只有一个用户请求,因此,Session对象的属性访问是线程安全的。但是,如果用户打开多个同属于一个进程的浏览器窗口,在这些窗口中的访问请求同属于一个Session,对于多个线程的并发修改显然不是线程安全的。

ServletRequest:因为Servlet容器对它所接收到的每一个请求,都创建一个新的ServletRequest对象,所以ServletRequest对象只在一个线程中被访问,因此对ServletRequest的属性访问是线程安全的。但是,如果在Servlet中创建了自己的线程,那么对ServletRequest的属性访问的线程安全性就得自己去保证。此外,如果作死的将当前请求的Servlet通过HttpSession或者ServletContext共享,那当然也是非线程安全的。


Listener
当Web应用在Web容器中运行时,Web应用内部会不断地发生各种事件:如Web应用的启动和停止、用户Session的开始和结束等,通常这些Web事件对开发者是透明的。Listener(监听器)是观察者模式的应用,通过方法回调来实现。

Listener生命周期
Listener在当web容器启动的时候,去读取每个web应用的web.xml配置文件,当配置文件中配有filter和listener时,web容器实例化listener,listener是当某个事件发生时,调用它特定方法,如HttpSessionListener,当创建一个session时会调用它的sessionCreated()方法,当servlet容器关闭或者重新加载web应用时lister对象被销毁。

Listener分类
不同功能的Listener 需要实现不同的 Listener  接口,一个Listener也可以实现多个接口,这样就可以多种功能的监听器一起工作。常用监听器:

1)监听 Session、request、context 的创建于销毁,分别为  

HttpSessionLister、ServletContextListener、ServletRequestListener

2)监听对象属性变化,分别为:

HttpSessionAttributeLister、ServletContextAttributeListener、ServletRequestAttributeListener

Filter应用场景
1、统一POST请求中文字符编码的过滤器 
2、控制浏览器缓存页面中的静态资源的过滤器
有些动态页面中引用了一些图片或css文件以修饰页面效果,这些图片和css文件经常是不变化的,所以为减轻服务器的压力,可以使用filter控制浏览器缓存这些文件,以提升服务器的性能。

3、使用Filter实现URL级别的权限认证
在实际开发中我们经常把一些执行敏感操作的servlet映射到一些特殊目录中,并用filter把这些特殊目录保护起来,限制只能拥有相应访问权限的用户才能访问这些目录下的资源。从而在我们系统中实现一种URL级别的权限功能。

4、实现用户自动登陆
首先,在用户登陆成功后,发送一个名称为user的cookie给客户端,cookie的值为用户名和md5加密后的密码。编写一个AutoLoginFilter,这个filter检查用户是否带有名称为user的cookie,如果有,则调用dao查询cookie的用户名和密码是否和数据库匹配,匹配则向session中存入user对象(即用户登陆标记),以实现程序完成自动登陆。

Filter应用实例
与开发 Servlet 不同的是,Filter 接口并没有相应的实现类可供继承,要开发过滤器,只能直接实现 Filer 接口。

--------------------- 
本文转载于https://blog.csdn.net/sunxianghuang/article/details/52107376 
 

猜你喜欢

转载自blog.csdn.net/genghaihua/article/details/84778004