精华内容
下载资源
问答
  • 主要介绍了浅谈SpringMVC的拦截器(Interceptor)和Servlet过滤器(Filter)的区别与联系 及SpringMVC 的配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...
  • java-web servlet 拦截器 过滤器使用 java-web servlet 拦截器 过滤器使用
  • Servlet过滤器与SpringMVC拦截器

    千次阅读 2017-03-30 22:09:02
    Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。 通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,...Servlet过滤器和SpringM

       Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
       通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。如下所示:

      Servlet过滤器和SpringMVC的拦截器是有区别的,区别如下:

           ①拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
      ②拦截器不依赖于servlet容器,过滤器依赖于servlet容器。
      ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
      ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
      ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
      ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

      注:在网页编程中action是<form>表单标签的属性,指代的是当用户提交这张表单的时候由哪张页面来进行处理,一般使用方式是:<form action=”处理页面路径”method=”post或get”>。表明表单提交后转到action指明的动作(其实就是java文件),在这个动作中可以得到表单的数据,并对这些数据进行操作。在这个动作中可以得到表单的数据,并对这些数据进行操作。

       一个Filter必须实现javax.servlet.Filter接口的三个方法:
       void setFilterConfig(FilterConfig config) //设置Filter的配置对象;
       FilterConfig getFilterConfig() //返回Filter的配置对象;
       void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) //执行Filter的工作

       Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下Filter的doFilter方法。

    过滤器应用举例:

    public class EncodingFilter implements Filter {    
    
        private String encoding = null;    
    
        public void destroy() {    
            encoding = null;    
        }    
    
        public void doFilter(ServletRequest request, ServletResponse response,    
                FilterChain chain) throws IOException, ServletException {    
            String encoding = getEncoding();    
            if (encoding == null){    
                encoding = ”gb2312”;    
            }    
            request.setCharacterEncoding(encoding);//在请求里设置指定的编码    
            chain.doFilter(request, response);  
            //通过控制对chain.doFilter的方法的调用,来决定是否需要访问目标资源  
        }    
    
        public void init(FilterConfig FilterConfig) throws ServletException {    
            this.encoding = FilterConfig.getInitParameter(“encoding”);    
        }    
    
        private String getEncoding() {    
            return this.encoding;    
        }    
    
    }    

    XML配置代码:

    <Filter>    
        <Filter-name>EncodingFilter</Filter-name>    
        <Filter-class>com.logcd.Filter.EncodingFilter</Filter-class>    
        <init-param>    
           <param-name>encoding</param-name>    
           <param-value>gb2312</param-value>    
        </init-param>    
    </Filter>    
    
    <Filter-mapping>    
       <Filter-name>EncodingFilter</Filter-name>    
       <url-pattern>/*</url-pattern>    
    </Filter-mapping>    

      以上代码完成的功能为,无论进入哪个页面,都要先执行EncodingFilter类的doFilter方法设置字符集。其中,doFilter()方法类似于Servlet接口的service()方法。当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的doFilter()方法。参数 request, response 为web 容器或 Filter 链的上一个 Filter 传递过来的请求和相应对象;参数 chain 代表当前 Filter 链的对象。 对于FilterChain接口,代表当前Filter链的对象。由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,或者目标Servlet 程序去处理,也可以直接向客户端返回响应信息,或者利用RequestDispatcher的forward()和include()方法,以及HttpServletResponse的sendRedirect()方法将请求转向到其他资源。这个方法的请求和响应参数的类型是 ServletRequest和ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议

       和Servlet一样,Filter的创建和销毁也是由Web容器负责。

      Filter的主要的作用就是用户在访问某个目标资源之前,对访问的请求和响应进行拦截,做一些处理,然后再调用目标程序,这样做的好处是可以对一些公共的操作进行抽象,就拿设置字符集来说,如果不使用这种方式,我们每个页面都要写设置字符集的语句。不但麻烦而且维护困难,但是如果使用Filter的话,只需要添加一个类,在xml中配置一下,如果不想使用了,将配置文件中的内容去除即可。Filter基于回调函数,我们需要实现的Filter接口中doFilter方法就是回调函数。

      当客户端发出Web资源的请求时,Web服务器根据应用程序配置文件设置的过滤规则进行检查,若客户请求满足过滤规则,则对客户请求/响应进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求/响应交给请求的Web资源处理。

      请求信息在过滤器链中可以被修改,也可以根据条件让请求不发往资源处理器,并直接向客户机发回一个响应。当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。同样在这个过程中,用户可以修改响应信息,从而完成一定的任务。

      过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。

      对于拦截器,写了点测试代码,顺便整理一下思路,搞清楚这几者之间的顺序:

      1、过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理

    @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("before...");
            chain.doFilter(request, response);
            System.out.println("after...");
        }

      chain.doFilter(request, response);这个方法的调用作为分水岭。事实上调用Servlet的doService()方法是在chain.doFilter(request, response);这个方法中进行的。

      2、拦截器是被包裹在过滤器之中的。

    @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("postHandle");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("afterCompletion");
        }

       preHandle()这个方法是在过滤器的chain.doFilter(request, response)方法的前一步执行,也就是在 System.out.println(“before…”)和chain.doFilter(request, response)之间执行的

      postHandle()方法在preHandle()方法之后,return ModelAndView之前执行,可以操控Controller的ModelAndView内容

      afterCompletion()方法是在过滤器返回给前端的前一步执行,也就是在chain.doFilter(request, response)和System.out.println(“after…”)之间执行

      3、SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。所以过滤器、拦截器、service()方法,dispatcher()方法的执行顺序应该是这样的,大致画了个图:其实非常好测试,自己写一个过滤器,一个拦截器,然后在这些方法中都加个断点,一路F8下去就得出了结论。

      

     

      总结:拦截器功在对请求权限鉴定方面确实很有用处,在我所参与的这个项目之中,第三方的远程调用每个请求都需要参与鉴定,所以这样做非常方便,而且它是很独立的逻辑,这样做让业务逻辑代码很干净。和框架的其他功能一样,原理很简单,使用起来也很简单,大致看了下SpringMVC这一部分的源码,其实还是比较容易理解的。

      Spring框架提供了一个已经实现了拦截器接口的抽象配器类HandlerInterceptorAdapter,继承这个类然后重写一下需要用到的方法就行了,可以少几行代码,这种方式Java中很多地方都有体现。

     

     

    展开全文
  • 过滤器和拦截器区别

    千次阅读 2020-11-08 19:33:47
    一、拦截器和过滤器区别 1、拦截器(Interceptor)只对action请求起作用 即对外访问路径 而过滤器(Filter)则可以对几乎所有的请求都能起作用 包括css js等资源文件 2、拦截器(Interceptor)是在Servlet和Controller...

    一、拦截器和过滤器的区别
    1、拦截器(Interceptor)只对action请求起作用 即对外访问路径
    而过滤器(Filter)则可以对几乎所有的请求都能起作用 包括css js等资源文件
    2、拦截器(Interceptor)是在Servlet和Controller控制器之间执行
    而过滤器(Filter)是在请求进入Tomcat容器之后 但是在请求进入Servlet之前执行

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

    在请求结束返回时也是一样 是在Servlet处理完之后返回给前端之间执行
    在这里插入图片描述
    二、拦截器和过滤器的代码实现
    1、拦截器
    首先需要一个拦截器类 并且这个类要实现HandlerInterceptor接口
    这个接口里面有三个方法:

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
    {
        // 在拦截点(Controller方法处理之前)执行拦截 若返回的是false则中断执行 反之亦然
        return false;
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
    {
        // 在处理过程中(Controller方法处理完之后  DispatcherServlet进行视图的渲染之前)执行拦截
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
    {
        // 在DispatcherServlet进行视图的渲染后 返回前进行拦截
    }
    

    稍微写一下方法:

    1 @Override
     2 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
     3 {
     4     // 在Controller方法处理之前执行拦截 若返回的是false则中断执行 反之亦然
     5 
     6     // 判断当前的User是否为空 若不为空则不拦截
     7     if (request.getSession().getAttribute("USERINFO")!=null)
     8     {
     9         return true;
    10     }
    11     // 进行拦截 返回登录界面
    12     response.sendRedirect(request.getContextPath()+"/user/doLogin.do");
    13     return false;
    14 }
    

    然后需要去SpringMVC的配置文件中配置拦截器:

     1 <!-- 配置拦截器 -->
     2 <mvc:interceptors>
     3     <mvc:interceptor>
     4         <!-- 拦截所有的mvc控制器(Controller) -->
     5         <mvc:mapping path="/**"/>
     6         <!-- 放行机制 指定对某个页面不进行拦截 -->
     7         <!-- 拦截器只对action起作用 因此填入的不是页面路径 而是方法 -->
     8         <mvc:exclude-mapping path="/user/doLogin.do"/>
     9         <!-- 指定使用哪个拦截器 -->
    10         <bean class="net.zjitc.interceptor.LoginInterceptor"/>
    11     </mvc:interceptor>
    12 </mvc:interceptors>
    

    如此 当访问的请求不为/user/doLogin.do会被拦截然后重定向到/user/doLogin.do
    但是访问其它的页面不会被拦截
    想要让页面也被拦截?你需要过滤器!

    2、过滤器
    同理 需要一个过滤器类 然后实现javax.servlet.Filter接口
    注意Filter的路径别导错了 因为有很多同名接口

     1 public class LoginFilter implements Filter {
     2 
     3     @Override
     4     public void init(FilterConfig filterConfig) throws ServletException
     5     {
     6         // 过滤器初始化
     7     }
     8 
     9     @Override
    10     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
    11     {
    12 
    13     }
    14 
    15     @Override
    16     public void destroy()
    17     {
    18         // 过滤器销毁
    19     }
    20 }
    

    稍微写一下方法:

    1 @Override
     2 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
     3 {
     4     // ServletRequest是一个接口 而HttpServletRequest是接口的实现
     5     // 但有些方法是HttpServletRequest独有的 例如getSession()
     6     // HttpServletRequest接口继承自ServletRequest接口 增加了和Http相关的方法
     7     // 但是我们可以强制转换
     8     HttpServletRequest request=(HttpServletRequest)servletRequest;
     9     HttpServletResponse response=(HttpServletResponse)servletResponse;
    10 
    11     // 若用户没有登录
    12     if (request.getSession().getAttribute("USERINFO")==null && request.getRequestURI().indexOf("/user/doLogin.do")==-1)
    13     {
    14         response.sendRedirect(request.getContextPath()+"/user/doLogin.do");
    15     }
    16     // 若用户已经登录 则继续下一个请求(继续访问)
    17     filterChain.doFilter(request,response);
    18 }
    

    然后需去web.xml中配置过滤器:

    1 <!-- 配置自定义的Filter 实现登录控制 -->
     2 <filter>
     3     <filter-name>sessionFilter</filter-name>
     4     <filter-class>net.zjitc.filter.LoginFilter</filter-class>
     5 </filter>
     6 <filter-mapping>
     7     <filter-name>sessionFilter</filter-name>
     8     <!-- 拦截所有的页面 /斜杠代表在webapp目录下 -->
     9     <url-pattern>/pages/*</url-pattern>
    10     <url-pattern>/css/*</url-pattern>
    11     <url-pattern>/img/*</url-pattern>
    12     <url-pattern>/failer.jsp</url-pattern>
    13 </filter-mapping>
    

    三、总结
    拦截器和过滤器其实都是AOP编程思想的实现
    都可以体现例如权限的检查 日志的记录等功能
    但是有不同之处:
    1、使用范围不同
    拦截器既可以用在web层 又可以用在Application和Swing程序中
    而filter是Servlet规范规定的 只能用于web程序中
    2、规范不同
    拦截器是在Spring容器内的 是Spring框架支持的
    而filter是Servlet规范规定的 是Servlet容器支持的

    =============================================================================================================================================================

    1、什么是Filter及其作用介绍
    (1)概念
    Servlet规范中三个技术 Servlet Listener Filter(顺序为L F S)
    Filter是sun公司中servlet2.3后增加的一个新功能,在javaEE中定义了一个接口 javax.servlet.Filter来描述过滤器

    (2)作用
    通过Filter可以拦截访问web资源的请求与响应操作.
    WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

    (3)举例
    在java web中,针对传入的request,或response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符。

    2、Filter API介绍
    Filter是javax.servlet包下的一个接口主要有以下三个方法

    destory()
    doFilter(ServletRequest request,ServletResponse response,FilterCjain chain)
    init(FilterConfig filterConfig)
    3、Filter链与Filter生命周期
    (1)Filter链介绍
    多个Filter对同一个资源进行了拦截,那么当我们在开始的Filter中执行chain.doFilter(request,response)时,是访问下一下Filter,直到最后一个Filter执行时,它后面没有了Filter,才会访问web资源。

    (2)关于多个FIlter的访问顺序问题
    如果有多个Filter形成了Filter链,那么它们的执行顺序是怎样确定的?
    它们的执行顺序取决于在web.xml文件中配置的先后顺序。

    (3)Filter生命周期
    当服务器启动,会创建Filter对象,并调用init方法,只调用一次.
    当访问资源,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,
    这个方法是真正拦截操作的方法.
    当服务器关闭时,会调用Filter的destroy方法来进行销毁操作
    过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。

    二、拦截器
    拦截器是spring容器的,是spring支持的

    java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。

    在面向切面编程AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。

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

    三、过滤器和拦截器的区别
    ①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
    ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
    ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
    ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
    ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
    ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。拦截器可以获取ioc中的service bean实现业务逻辑。

    (功课)回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

    (功课)Spring MVC中每个控制器中可以定义多个请求处理方法,我们把这种请求处理方法简称为Action

    在这里插入图片描述

    展开全文
  • 下面从几个方面阐述一下题目中四个概念的区别与联系:  1、概念  2、生命周期 ... 1、servletservlet是一种运行服务器端的java应用程序,具有独立于平台协议的特性,并且可以动态的生成w

    下面从几个方面阐述一下题目中四个概念的区别与联系:

             1、概念

             2、生命周期

             3、职责

             4、执行过程

            

             一、概念:

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

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

            3、listener:监听器,从字面上可以看出listener主要用来监听只用。通过listener可以监听web服务器中某一个执行动作,并根据 其要求作出相应的响应。通俗的语言说就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执 行代码的功能组件。

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

            二、生命周期:

            1、servlet:servlet的生命周期始于它被装入web服务器的内存时,并在web服务器终止或重新装入servlet时结束。servlet一旦被装入web服务器,一般不会从web服务器内存中删除,直至web服务器关闭或重新结束。
              (1)、装入:启动服务器时加载Servlet的实例; 
            (2)、初始化:web服务器启动时或web服务器接收到请求时,或者两者之间的某个时刻启动。初始化工作有init()方法负责执行完成; 
            (3)、调用:从第一次到以后的多次访问,都是只调用doGet()或doPost()方法; 
            (4)、销毁:停止服务器时调用destroy()方法,销毁实例。 

            

               2、filter:(一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、destroy(),空实现也行) 
             (1)、启动服务器时加载过滤器的实例,并调用init()方法来初始化实例; 
             (2)、每一次请求时都只调用方法doFilter()进行处理; 
             (3)、停止服务器时调用destroy()方法,销毁实例。

             3、listener:类似于servlet和filter

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

           4、interceptor:以struts的拦截器为例,加载了struts.xml以后,初始化相应拦截器。当action请求来时调用intercept方法,服务器停止销毁interceptor。

           三、职责

           1、servlet:

            创建并返回一个包含基于客户请求性质的动态内容的完整的html页面;
            创建可嵌入到现有的html页面中的一部分html页面(html片段);
            读取客户端发来的隐藏数据;
            读取客户端发来的显示数据;
            与其他服务器资源(包括数据库和java的应用程序)进行通信;
            通过状态代码和响应头向客户端发送隐藏数据。

           2、filter:

            filter能够在一个请求到达servlet之前预处理用户请求,也可以在离开servlet时处理http响应:
            在执行servlet之前,首先执行filter程序,并为之做一些预处理工作;
            根据程序需要修改请求和响应;
            在servlet被调用之后截获servlet的执行

             3、listener:职责如概念。

              servlet2.4规范中提供了8个listener接口,可以将其分为三类,分别如下:
             第一类:与servletContext有关的listner接口。包括:ServletContextListener、ServletContextAttributeListener
             第二类:与HttpSession有关的Listner接口。包括:HttpSessionListner、 HttpSessionAttributeListener、HttpSessionBindingListener、                      HttpSessionActivationListener;
             第三类:与ServletRequest有关的Listener接口,包括:ServletRequestListner、ServletRequestAttributeListener

            4、interceptor:与过滤器十分相似,通过层层拦截,处理用户的请求和响应。


            备注:web.xml 的加载顺序是:context-param -> listener -> filter -> servlet 。了解了这几个概念的区别以后,不难理论这个加载顺序了。


            四、几个区别:

            1,servlet 流程是短的,url传来之后,就对其进行处理,之后返回或转向到某一自己指定的页面。它主要用来在 业务处理之前进行控制.
            2,filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而servlet 处理之后,不会继续向下传递。filter功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。
             filter可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等
            3, servlet,filter都是针对url之类的,而listener是针对对象的操作的,如session的创建,session.setAttribute的发生,在这样的事件发生时做一些事情。
         可用来进行:Spring整合Struts,为Struts的action注入属性,web应用定时任务的实现,在线人数的统计等
     
           4,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 来在接收之前做事    

            5,struts2中的过滤器和拦截器的区别与联系:

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

            

            五、执行流程图:

             1、servlet:

               

              2、filter:

              

                   

                 

               3、listener:

                 

               4、interceptor:

                

    展开全文
  •  1.servletservlet是一种运行在服务器端的java应用程序,具有独立于平台协议的特性,可以动态生成web页面,它工作在客户端请求与服务器响应的中间层;  2.filter:filter是一个可以复用的代码片段,可以用来...

    一、目录

      1.概念

      2.生命周期

      3.职责

      4.执行过程

    二、内容

      概念

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

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

      3.listener:监听器,通过listener可以监听web服务器中某一执行动作,并根据其要求作出相应的响应。就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件;

      4.interceptor:拦截器是对过滤器更加细化的应用,他不仅可以应用在service方法前后还可以应用到其他方法的前后拦截器;

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

      生命周期

      1.servlet

      servle的生命周期开始于被装入web服务器的内存中,并在web服务终止或者重新装入servlet的时候结束;servlet一旦被装入web服务器,一般不会从web服务器内存中删除;直到web服务器关闭;

      装入:启动服务器时加载servlet的实例;

      初始化:web服务器接收到请求时,或者两者之间的某个时刻启动,调用init()

      调用:从第一次到以后的多次访问,都只调用doGet()或dopost)()方法;

      销毁;停止服务器时调用destroy()方法,销毁实例;

      2.filter

      需要实现javax.servlet包的Filter接口的三个方法init(),doFilter(),destroy();

      加载:启动服务器时加载过滤器的实例,并调用init()方法;

      调用:每次请求的时候只调用方法doFilter()进行处理;

      销毁:服务器关闭前调用destroy()方法,销毁实例;

      3.listener

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

      4.interceptor

      加载配置文件后初始化拦截器,当有对action的请求的时候,调用interceptor方法,最后也是根据服务器停止进行销毁;

      职责

      1.servlet

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

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

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

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

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

      2.filter

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

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

      在servlet被调用之后截获servlet的执行

      3.listener

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

      第一类:与HttpContext有关的listener接口,包括:ServletContextListener、ServletContextAttributeListener

      第二类:与HttpSession有关的listner接口。包括:HttpSessionListener、HttpSessionAttributeListener、

    HttpSessionBindingListener、 HttpSessionActivationListener、

      第三类:与ServletRequest有关的Listener接口,包括:ServletRequestListener、ServletRequestAttributeListener

         4.interceptor

      与过滤器类似,通过层层拦截,处理用户的请求和响应;

      区别

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

      2,filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等,而servlet 处理之后,不会继续向下传递。filter功能可用来保持流程继续按照原来的方式进行下去,或者主导流程,而servlet的功能主要用来主导流程。

       filter可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等

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

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

      4,interceptor拦截器,类似于filter,不过在struts中配置,不是在web.xml,并且不是针对url的而是针对action的,当页面提交时,进行过滤操作;

      执行流程

      1.servlet:

      

      2.filter

      

      

      3.listener

      

      4.interceptor

      

     

     

    展开全文
  • 过滤器 拦截器的 6个区别,别再傻傻分不清了

    千次阅读 多人点赞 2020-06-04 10:01:39
    本文收录在个人博客:www.chengxy-nds.top,技术资料共享,同进步 周末有个小伙伴加我微信,向我请教了一个问题:老哥,过滤器 (Filter) 拦截器 (Interceptor) 有啥区别啊? 听到题目我的第一感觉就是:简单! ...
  • servlet过滤器实例经典过滤器

    热门讨论 2011-11-05 20:25:24
    servlet过滤器实例经典过滤器,手把手交你配置过滤器,五大常用过滤器源码,走过路过的同事们注意了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  • JSP Servlet 中的过滤器都是 Java 类。 过滤器可以动态地拦截请求响应,以变换或使用包含在请求或响应中的信息。 可以将一个或多个过滤器附加到一个 Servlet 或一组 Servlet过滤器也可以附加到 JavaServer ...
  • 报错问题:浏览器控制台提示如下: ... 界面体现的效果就是,界面样式失效,css,js,ico文件都...参考网上相关资料后,发现是因为web.xml中添加的编码过滤器encodeFilter把所有的请求都拦截了,拦截不要紧,关键是拦.
  • 本文实例讲述了JSP使用Servlet过滤器进行身份验证的方法。分享给大家供大家参考,具体如下: 1、Servlet过滤器的作用描述 (1)在HttpServletRequest到达Servlet 之前,拦截客户的HttpServletRequest。 根据需要...
  • Servlet过滤器与Spring拦截器详解

    千次阅读 2017-06-07 13:42:18
    第一部分:过滤器Filter一:Filter简介Servlet API中提供了一个javax.servlet.Filter接口,开发web应用时,实现了这个接口的Java类,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问...
  • 框架学习】springMVC过滤器servlet拦截器区别 2017年08月02日 19:50:46 阅读数:237 标签: 拦截器 过滤器 springmvc servlet 更多 个人分类: 框架学习 版权声明:本文为博主原创文章,转载请注明出处!!!...
  • 1、深入SpringBoot2.x过滤器Filter使用Servlet3.0配置自定义Filter实战(核心知识) 简介:讲解SpringBoot里面Filter讲解使用Servlet3.0配置自定义Filter实战 filter简单理解:人--->检票员(filter)--->...
  • 过滤器和拦截器

    2019-04-28 17:19:50
    整体认识:过滤器和拦截器是我们常说的AOP思想的两个具体实现,接下来我们一起看看它们之间的区别和具体的使用。 1.过滤器和拦截器区别 使用范围:过滤器Servlet规范规定的,仅用于Web程序中;拦截器是属于...
  • 拦截器过滤器区别

    万次阅读 多人点赞 2019-06-20 23:11:09
    文章目录一、二者理解过滤器(Filter)拦截器(Interceptor)二、拦截器过滤器区别区别:三、拦截器过滤器的触发时机拦截器过滤器触发时机不一样四、使用场景五、图解 一、二者理解 过滤器(Filter) 过滤器...
  • servlet/过滤器/拦截器/监听器

    千次阅读 2015-08-19 03:23:20
     1、servletservlet是一种运行服务器端的java应用程序,具有独立于平台协议的特性,并且可以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。  2、filter:filter是一个可以复用的代码片段,...
  • MyBatis拦截器实现原理  递归target = interceptor.plugin(target) ...servlet过滤器实现原理  filters封装在数组中,将filterchan引用传递 Struts2拦截器实现原理 Interceptors封装在list中,将...
  • 过滤器和拦截器区别和执行顺序

    千次阅读 2018-07-16 14:51:07
    1、拦截器 java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用...
  • 主要为大家详细介绍了servlet+jsp实现过滤器,防止用户未登录访问,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • servlet过滤器和监听器

    千次阅读 2018-08-03 17:13:26
    过滤器也是Servlet的一种,因此也有initdestroy方法,还有一个服务方法,只是这里提供的服务是过滤; 一个Servlet要想成为过滤器需要实现javax.servlet.Filter接口; 一般客户端发出请求后会交给Servlet;如果...
  • Servlet过滤器、监听器与拦截器

    千次阅读 2018-07-27 17:26:35
      Servlet是一种运行于服务器端的Java应用程序,具有独立于平台协议的特性,并且可以动态的生成Web页面,它工作在客户端请求与服务器响应的中间层,具有跨平台与可移植性强等优点。 Filter   Filter是一个可...
  • springboot 是spring框架...过滤器filter是servlet的API,比较依赖servlet,他们有不同也有一些相似的地方。 1Filter基于servlet ,主要用于servlet存在的环境。拦截器用于servlet,也可以用于其他环境中。 2Filte...
  • 拦截器和过滤器区别 1、拦截器基于动态代理 , 过滤器基于函数回调 2、拦截器不依赖于servlet容器,通过动态代理实现,过滤器依赖于servlet容器 3、拦截器在方法前后,异常前后等调用,而过滤器只能在请求前请求...
  • 本篇摘要 1.拦截器Intercepter与过滤器Filter的区别 2.拦截器链与过滤器链的执行顺序 3.拦截器过滤器的执行时机 4.拦截器过滤器的适用场景 5.拦截器过滤器的具体配置使用
  • 本文来说下Spring拦截器和过滤器区别 文章目录概述 概述 拦截器和过滤器 filter和拦截器的功能都是拦截,filter拦截的目标是servlet的执行,而拦截器拦截的是Spring MVC定义的概念,叫handler(常见的就是我们...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,576
精华内容 24,230
关键字:

servlet过滤器和拦截器区别