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)编写示例


二、SpringMVC拦截器:

1、 拦截器是面向切面编程的,依赖的技术就是Java的动态代理。(拦截器是被包裹在过滤器之中的)

**2、拦截器栈:**就是将拦截器按一定的顺序联结成一条链。
在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前(xml)定义的顺序被调用。


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

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

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

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

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


四、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
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页