Java过滤器、SpringMVC拦截器、Java监听器

一、Java过滤器:

1、 在Java Web中,在传入的request、response提前过滤掉一些信息、提前设置一些参数、统一设置字符集、控制是否登录等,然后在传入Servlet等中进行处理。
2、Filter链: 一个Web应用中,可以编写多个Filter,这些Filter组合起来称之为一个Filter链。Web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter。
3、 当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。


Java Web中过滤器(filter)编写示例

Java监听器:

1、Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。
2、主要作用是:做一些初始化的内容添加工作、设置一些基本的内容(比如一些参数或者是一些固定的对象等)。


Java代码:

package com.lzw.filter.demo;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class InitDataListener implements ServletContextListener {

    private static ServletContext servletContext;

    public static ServletContext getServletContext() {
        return servletContext;
    }

    @Override
    public void contextInitialized(ServletContextEvent contextEvent) {
        servletContext = contextEvent.getServletContext();
        //final ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        System.out.println("服务器启动完毕!");
        System.out.println(servletContext);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {}
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

   <listener>
        <listener-class>com.lzw.filter.demo.InitDataListener</listener-class>
   </listener>
</web-app>

控制台结果:

信息: Starting service Catalina
2013-10-31 15:13:55 org.apache.catalina.core.StandardEngine startInternal
信息: Starting Servlet Engine: Apache Tomcat/7.0.42
服务器启动完毕!
org.apache.catalina.core.ApplicationContextFacade@7966340c
2013-10-31 15:13:56 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-apr-8080"]
2013-10-31 15:13:56 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-apr-8009"]
2013-10-31 15:13:56 org.apache.catalina.startup.Catalina start
信息: Server startup in 402 ms

二、SpringMVC拦截器:

1、 拦截器是面向切面编程的,依赖的技术就是Java的动态代理。(拦截器是被包裹在过滤器之中的)
2、拦截器栈:就是将拦截器按一定的顺序联结成一条链。
在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前(xml)定义的顺序被调用。

三、过滤器和拦截器的区别:

1、过滤器是基于函数回调,而拦截器是基于java的反射机制的。
2、过滤器依赖Servlet容器,而拦截器不依赖Servlet容器。
3、过滤器则可以对几乎所有的请求起作用(如 .js、.css等),而拦截器只能对action请求起作用。
4、过滤器不能访问,而拦截器可以访问action上下文、值栈里的对象。
5、过滤器只能在容器初始化时被调用一次,而在action的生命周期中,拦截器可以多次被调用。
6、过滤器就不行,而拦截器可以获取IOC容器中的各个bean,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。


备注:
**action:**Action类是用户请求和业务逻辑之间的桥梁,是MVC模式中Controller层。

执行顺序 : 过滤前 –> 拦截前 –> Action处理 –> 拦截后 –> 过滤后
过滤是一个横向的过程:
1、首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理)。
2、过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理。
3、接着把处理后的数据发给对应的Action。
4、Action处理完成返回后,拦截器还可以做其他过程。
5、最后再向上返回到过滤器的后续操作。


备注:相关电子书中介绍
在这里插入图片描述

四、拦截器于过滤器对比
两者都是AOP编程思想的实现,都能够实现权限控制和日志记录等问题的处理,但是两者粒度不同拦截对象不一样

适用范围不同:Filter是servlet的规范,只能用于web程序,但是拦截器可以用于application等程序。

规范不同:Filter是servlet的规范。但是Interceptor是spring容器支撑,有spring框架支持。

使用资源不一样:spring的拦截器由于依赖spring,也是spring的一个组件,因此能够在拦截器中使用spring的任何资源和对象。例如service对象,数据源,事务管理等,通过ioc注入拦截器即可,而filter不能

粒度不同:Filter只能在servlet的前后起作用,而拦截器能在方法前后异常前后执行,更加灵活,粒度更小,spring框架程序优先使用拦截器。

案例执行图
在这里插入图片描述

在这里插入图片描述
执行结果如下:

0:过滤器1的初始化方法
1:过滤器1,客户端向Servlet发送的请求被我拦截到了
2:拦截器1的前置方法 preHandle
3:拦截器2的前置方法 preHandle
4: controller主方法
5:拦截器2的后置方法postHandle(在controller主方法执行之后执行)
6:拦截器1的后置方法postHandle(在controller主方法执行之后执行)
7:拦截器2的完成后方法afterCompletion(在DispatcherServlet处理完请求后,才会执行)
8:拦截器1的完成后方法afterCompletion(在DispatcherServlet处理完请求后,才会执行)
9:过滤器1,Servlet向客户端发送的响应被我拦截到了
10:过滤器的销毁方法

猜你喜欢

转载自blog.csdn.net/chinasi2012/article/details/86568721