因为之前一直分不清过滤器和拦截器的区别,所以有了两者差不多的错觉,因此在这里总结下servlet/filter/listener/interceptor过滤器、监听器、拦截器。
在此之前先简单回顾下servlet:
概述:servlet是一种运行服务器端的java应用程序,它工作在客户端请求与服务器响应的中间层。
主要作用:在于交互式地浏览和修改数据,生成动态 Web 内容。
访问流程:
1,客户端发送请求至服务器端;
2,服务器将请求信息发送至 Servlet;
3,Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
4, 服务器将响应返回给客户端。
filter:
概述:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者 修改从某一的响应。
主要的用途:过滤字符编码、做一些业务逻辑判断等。
工作原理:就是只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置 编 码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初 始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。
访问流程 :
1、在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
2、根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
3、在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
4、根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
总体来说:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
listener:
概述:从字面上可以看出listener主要用来监听的,通过listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。通俗的语言说就是 在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件。它也是随web应用的启动而启动,只 初始化一次,随web应用的停止而销毁。
主要作用: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。 举个例子,spring 的总监听器 会在服务器 启动的时候实例化我们配置的bean对象。
interceptor :
首先强调下:interceptor不属于java web所提供的基本功能
概述:它在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用,用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入 某些操作。比如在你调用一个方法前打印一个字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常 的时候做业务逻辑的操作。
拦截器是基于web框架的调用,在SpringMVC中就是依赖于SpringMVC框架,可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用,但是需要注意的是它对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
对上述总结下:
servlet用来进行基本的web内容的提供;
Filter在服务器和功能之间提供一些公共性质的功能,依赖于Servlet;
listener则是提供了一些运行环境中的动态交互的基础功能
(备注:servlet、filter、listener在web.xml 的加载顺序是:context-param -> listener -> filter -> servlet )——>理发师顺序)
interceptor的面向切面编程,本质是解决程序层面的需求,而不是架构层面的问题。 依赖于框架;
最后说说filter和Interceptor的区别:
拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调;
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法。
Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用
在功能上来讲Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比如登录不登录之类)
而从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活;