Filter、Interceptor、Servlet和Listener

Servlet

需继承HttpServlet

servlet是一个类,是用于处理后台业务逻辑的,在web.xml下配置servlet、servlet-mapping,即可设定的请求交由设定的servlet进行处理。

init()、destroy()、service()

<servlet>
   <servlet-name>hello</servlet-name>
   <servlet-class>org.lxh.servlet.HelloServlet</servlet-class>///HelloServlet是类名
</servlet>
<servlet-mapping>
   <servlet-name>hello</servlet-name>
   <url-pattern>/servletdemo</url-pattern>///当敲入本机地址后,/demo后/servletdemo会找到编译后的HelloServlet文件。
</servlet-mapping>

可以处理get、post等请求

Filter

Filte是过滤器,能够对servlet容器的请求和响应对象进行检查和修改。可以在servlet被调用前检查request对象,修改request header和request内容;在servlet被调用后检查response对象,修改response header和response内容。并且多个过滤器可以串联起来,形成管道效应,协同修改请求和响应对象。

需要实现Filte接口,方法有

  1. init()过滤器初始化方法
  2. destroy()过滤器销毁调用的方法
  3. doFilter()完成实际的过滤操作方法,当客户请求和访问与过滤器关联的url时,会先调用此方法

servlet容器根据filter在web.xml中定义的先后顺序,依次调用它们的doFilter()方法。

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对象(即用户登陆标记),以实现程序完成自动登陆。

Listener

Listener监听web容器运行时内部发生的各种事件

监听对象

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

HttpSessionLister、ServletContextListener、ServletRequestListener

void contextInitialized(ServletContextEvent sce):创建Servletcontext时
 
void contextDestroyed(ServletContextEvent sce):销毁Servletcontext时

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

HttpSessionAttributeLister、ServletContextAttributeListener、ServletRequestAttributeListener

void attributeAdded(ServletContextAttributeEvent event):添加属性时;
 
void attributeReplaced(ServletContextAttributeEvent event):替换属性时;
 
void attributeRemoved(ServletContextAttributeEvent event):移除属性时;

3)与session中的绑定的对象相关的监听器(对象感知监听器)
1:HttpSessionBindingListener监听 
⑴在需要监听的实体类实现HttpSessionBindingListener接口 
⑵重写valueBound()方法,这方法是在当该实体类被放到Session中时,触发该方法 
⑶重写valueUnbound()方法,这方法是在当该实体类从Session中被移除时,触发该方法 

2:HttpSessionActivationListener监听 
⑴在需要监听的实体类实现HttpSessionActivationListener接口 
⑵重写sessionWillPassivate()方法,这方法是在当该实体类被序列化时,触发该方法 
⑶重写sessionDidActivate()方法,这方法是在当该实体类被反序列化时,触发该方法

应用

  1. 利用HttpSessionLister,统计当前在线人数。
  2. 自定义Session扫描器

Intercaptor

拦截器是在面向切面编程中应用的。

SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ;第二种方式是实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类

interceptor 的执行顺序大致为:

  1. 请求到达 DispatcherServlet
  2. DispatcherServlet 发送至 Interceptor ,执行 preHandle
  3. 请求达到 Controller
  4. 请求结束后,postHandle 执行

Spring 中主要通过 HandlerInterceptor 接口来实现请求的拦截,实现 HandlerInterceptor 接口需要实现下面三个方法:

  • preHandle() – 在handler执行之前,返回 boolean 值,true 表示继续执行,false 为停止执行并返回。
  • postHandle() – 在handler执行之后, 可以在返回之前对返回的结果进行修改
  • afterCompletion() – 在请求完全结束后调用,可以用来统计请求耗时等等

拦截器(Interceptor)和过滤器(Filter)的执行顺序

 

拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。

过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射,代理分静态代理和动态代理,动态代理是拦截器的简单实现。

何时使用拦截器?何时使用过滤器?

  • 如果是非spring项目,那么拦截器不能用,只能使用过滤器。
  • 如果是处理controller前后,既可以使用拦截器也可以使用过滤器。
  • 如果是处理dispaterServlet前后,只能使用过滤器。

原文

https://blog.csdn.net/qq_37211608/article/details/81363121

https://www.cnblogs.com/junzi2099/p/8022058.html

https://www.cnblogs.com/lgjava/p/10559356.html