Java servlet、filter、listener、interceptor之间的区别和联系

servlet、filter、listener、interceptor之间的区别和联系

一、概念

1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。

2.filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。

3.listener:监听器,从字面上可以看出listener主要用来监听只用。通过listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。

通俗的语言说就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件。

4.interceptor:是在面向切面编程的,就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法。

比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

5.servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的拦截器配置到struts.xml中。spring的拦截器配置到spring.xml中。

二、加载顺序

web.xml 的加载顺序是:context- param -> listener -> filter -> servlet

三、职责

1.servlet:

(1)创建并返回一个包含基于客户请求性质的动态内容的完整的html页面

(2)创建可嵌入到现有的html页面中的一部分html页面(html片段)

(3)读取客户端发来的隐藏数据

(4)读取客户端发来的显示数据

(5)与其他服务器资源(包括数据库和java的应用程序)进行通信

(6)通过状态代码和响应头向客户端发送隐藏数据。

2.filter:

(1)filter能够在一个请求到达servlet之前预处理用户请求,也可以在离开servlet时处理http响应

(2)在执行servlet之前,首先执行filter程序,并为之做一些预处理工作

(3)根据程序需要修改请求和响应

(4)在servlet被调用之后截获servlet的执行。

3.listener:

servlet2.4规范中提供了8个 listener 接口,可以将其分为三类,分别如下:

(1)与 servletContext 有关的 listne r接口。包括:ServletContextListener、ServletContextAttributeListener

(2)与 HttpSession 有关的 Listner 接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、 HttpSessionActivationListener

(3)与 ServletRequest 有关的 Listener 接口,包括:ServletRequestListner、ServletRequestAttributeListener

四、区别

1.servlet:servlet 流程是短的,url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面。它主要用来在业务处理之前进行控制。

2.filter:流程是线程性的,url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而 servlet 处理之后,不会继续向下传递。

filter 功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。可以将 Filter 看成是 servlet 的一个补充(擦屁股的)。

Filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。

它与Servlet的区别在于:它不能直接向用户生成响应。

完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

3.匹配规则

当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html(我的应用上下文是test),

容器会将http://localhost/tes去掉,将剩下的/aaa.html部分拿来做servlet的映射匹配,也就是拿这剩下的部分与web.xml中配置的servlet的url-pattern进行匹配。

注意:这个映射匹配过程是有一定的规则的,而且每次匹配最终都只匹配一个 servlet。(这一点和filter不同)

servlet 匹配规则:当一個servlet匹配成功后就不会在往下去匹配了

精确路径的匹配:

例子:比如servletA 的url-pattern为 /test,servletB的url-  pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,

这个时候容器就会先 进行精确 路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。

最长路径的匹配:

例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,

容器会选择路径最长的servlet来匹配,也就是这里的servletB。

扩展匹配:如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。

例子:servletA的url-pattern:*.action

4.servlet,filter 都是针对 url 之类的,而 listener 是针对对象的操作的,如 session 的创建,session.setAttribute 的发生,在这样的事件发生时做一些事情。

可用来进行:Spring整合Struts,为Struts的action注入属性,web应用定时任务的实现,在线人数的统计等

5.interceptor 拦截器,类似于filter,不过在struts.xml中配置,不是在web.xml,并且不是针对URL的,而是针对action,当页面提交action时,

进行过滤操作,相当于struts1.x提供的plug-in机制,可以看作,前者是struts1.x自带的filter,而interceptor 是struts2 提供的filter。

与filter不同点:

(1)不在web.xml中配置,而是在struts.xml中完成配置,与action在一起
(2)可由action自己指定用哪个interceptor 来在接收之前做事

6.struts2中的过滤器和拦截器的区别与联系:

(1)拦截器是 Struts2 提供的,而过滤器是由 Servlet 标准提供的

(2)拦截器拦截目标 Action 的目标方法,而过滤器针对各种 web 资源

(3)拦截器在 struts.xml 中配置,而过滤器在 web.xml文件中配置

(4)拦截器使用拦截器栈组织在一起,而过滤器是根据被拦截的资源联系在一起,由他们在配置文件中的位置决定了先后执行顺序

(5)拦截器是基于java反射机制的,而过滤器是基于函数回调的。
(6)过滤器依赖与servlet容器,而拦截器不依赖与servlet容器。
(7)拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
(8)拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
(9)在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • JavaWeb Servlet中Filter过滤器的详解

    JavaWeb Servlet中Filter过滤器的详解 1.简述 Filter过滤器,对web服务器所有web资源进行过滤,从而实现一些特殊的功能(权限访问控制.过滤敏感词汇.压缩响应信息).Filter能够对Servlet容器的请求和响应进行检查和修改,其本身不能生成请求request和响应response,只提供过滤作用(Servlet被调用之前检查Request对象修改其相关信息,Servlet被调用后检查Response修改其相关信息),Filter对象常驻服务器. 2.Lifecyc

  • Servlet和Filter之间的区别与联系

    filter是一个可以复用的代码片段,可以用来转换HTTP请求.响应和头信息.Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应. 最近使用插装的时候,改用cookie对计算机进行识别,加入了过滤,仔细研究了一下servlet和filter,区别主要是: 过滤器的生命周期一般都要经过下面三个阶段: servlet的特点是: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Con

  • 详解Servlet之过滤器(Filter)

    过滤器 1.为什么使用它? 有很多全站性的东西需要处理,例如乱码问题,通过过滤器统一进行过滤更简单 2.有什么用? 实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截.简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理. 3.怎么用? 步骤1:先写一个类实现javax.servlet.Filter接口 步骤2:重写抽象方法 步骤3:在doFilter()方法中写处理代码,最后用FilterChain调用FilterCha

  • 详谈Servlet和Filter的区别以及两者在Struts2和Springmvc中的应用

    在javaweb开发中,Servlet和Filter是很重要的两个概念,我们平时进行javaweb开发的时候,会经常和Servlet和Filter打交道,但我们真的了解Servlet和Filter吗? 一.基本概念 Servlet: Servlet 是在WEB服务器上运行的程序.这个词是在 Java applet的环境中创造的,Java applet 是一种当作单独文件跟网页一起发送的小程序,它通常用于在客户端运行,结果得到为用户进行运算或者根据用户互作用定位图形等服务. 服务器上需要一些程序,

  • Spring Boot 编写Servlet、Filter、Listener、Interceptor的方法

    前言 在编写过滤器.监听器.拦截器之前我们需要在spring-boot启动的类上加上注解@ServletComponentScan: @SpringBootApplication @ServletComponentScan public class MySpringbootApplication { public static void main(String[] args) { SpringApplication.run(MySpringbootApplication.class, args)

  • servlet过滤器(Filter)详解(九)

    本文实例为大家分享了servlet过滤器的具体代码,供大家参考,具体内容如下 1.servlet过滤器产生背景 项目中我们会遇到这样一类的需求,对访问服务器的用户ip实施过滤,只有在允许名单中的ip才能访问服务,为了实现需求,每当有客户端请求时,我们都会写校验ip的代码,客户端能够访问到的servlet我们都需要这样做,很明显这样做有一个缺点,就是代码冗余,维护不方便,如果验证规则改变,修改起来也特别麻烦. 为了解决以上问题,Filter 技术应运而生. 2.servlet过滤器是什么? ser

  • SpringBoot初始教程之Servlet、Filter、Listener配置详解

    1.介绍 通过之前的文章来看,SpringBoot涵盖了很多配置,但是往往一些配置是采用原生的Servlet进行的,但是在SpringBoot中不需要配置web.xml的 因为有可能打包之后是一个jar包的形式,这种情况下如何解决?SpringBoot 提供了两种方案进行解决 2.快速开始 2.1 方案一 方案一采用原生Servlet3.0的注解进行配置.@WebServlet .@WebListener.@WebFilter是Servlet3.0 api中提供的注解 通过注解可以完全代替web

  • web.xml中servlet, bean, filter, listenr 加载顺序_动力节点Java学院整理

    web.xml 文件中一般包括 servlet, spring, filter, listenr的配置.那么他们是按照一个什么顺序加载呢?加载顺序会影响对spring bean 的调用. 比如filter需要用到 bean ,但是加载顺序是 先加载filter 后加载spring,则filter中初始化操作中的bean为null:首先可以肯定 加载顺序与他们在web.xml 文件中的先后顺序无关. web.xml 中 listener 和 serverlet 的加载顺序为 先 listener

  • springboot扫描自定义的servlet和filter代码详解

    这几天使用spring boot编写公司一个应用,在编写了一个filter,用于指定编码的filter,如下: /** * Created by xiaxuan on 16/11/1. */ @WebFilter(urlPatterns = "/*",filterName="CharacterEncodeFilter", initParams={ @WebInitParam(name="encoding",value="UTF-8&qu

  • Filter、Servlet、Listener的学习_动力节点Java学院整理

    Java中Filter.Servlet.Listener的学习资料,希望大家喜欢 1.Filter的功能 filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个"servlet chaining"(servlet 链). 一个Filte

  • 解决cannot be cast to javax.servlet.Filter 报错的问题

    cannot be cast to javax.servlet.Filter 报错, 原因servlet-api.jar冲突 使用maven开发web应用程序, 启动的时候报错: jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class 然后输出错误: 严重: Exception starting filter encodingFilter java.lang

随机推荐