• servlet和filter之间的关系


    最近使用插装的时候,改用cookie对计算机进行识别,加入了过滤,仔细研究了一下servlet和filter,区别主要是:

    过滤器的生命周期一般都要经过下面三个阶段:

    servlet的特点是:

    初始化

    当容器第一次加载该过滤器时,init() 方法将被调用。该类在这个方法中包含了一个指向 Filter Config 对象的引用。我们的过滤器实际上并不需要这样做,因为其中没有使用初始化信息,这里只是出于演示的目的。

    过滤

    过滤器的大多数时间都消耗在这里。doFilter方法被容器调用, 同时传入分别指向这个请求/响应链中的 Servlet Request、Servlet Response 和 Filter Chain 对象的引用。然后过滤器就有机会处理请求,将处理任务传递给链中的下一个资源(通过调用 Filter Chain 对象引用上的 doFilter方法),之后在处理控制权返回该过滤器时处理响应。

    析构

    容器紧跟在垃圾收集之前调用 destroy()方法,以便能够执行任何必需的清理代码。

    关于chain.doFilter(request,response)
    他的作用是将请求转发给过滤器链上下一个对象。这里的下一个指的是下一个filter,如果没有filter那就是你请求的资源。 一般filter都是一个链,web.xml 里面配置了几个就有几个。一个一个的连在一起 

    request -> filter1 -> filter2 ->filter3 -> .... -> request resource.

    filter是链式操作,那么在处理单个filter时必须最后跳转到servlet对请求进行响应。

    如果走chain的话,通过chain.doFilter(request,response)这个方法会立即跳转到被拦截的servlet并且执行完还要再返回filter.chain相当于一扇门,从这扇门出去再从这扇门回来.调用filter的方法就是在web.xml中配置,需要配置一个与你需要拦截的servlet相同的url-pattern.
    <!-- 配置一个过滤器 -->  
     <filter>   
     <filter-name>suibianxie</filter-name>  
      <filter-class>com.etoak.filter.MyEncoding</filter-class>
       <!-- 配置一个私有参数 -->    <init-param>     <param-name>mycode</param-name>     <param-value>gbk</param-value>    </init-param>   </filter>   
    <!-- 拦截的先后顺序和mapping的顺序有关 -->   <filter-mapping>    <filter-name>suibianxie</filter-name>
       <!-- 注意这里和要拦截的servlet的url-pattern必须一致,等于是过滤器    抢在servlet之前拦截住了 -->
       <url-pattern>/servlet/Test</url-pattern>   </filter-mapping>  
     <!-- 配置第二个过滤器 -->   <filter>    <filter-name>suibianxie2</filter-name>    <filter-class>com.etoak.filter.Naming</filter-class>   </filter>
      <filter-mapping>    <filter-name>suibianxie2</filter-name>    <url-pattern>/servlet/Test</url-pattern>   </filter-mapping>      <servlet>     <servlet-name>Test</servlet-name>     <servlet-class>com.etoak.servlet.Test</servlet-class>   </servlet>   <servlet-mapping>     <servlet-name>Test</servlet-name>     <url-pattern>/servlet/Test</url-pattern>   </servlet-mapping>
  • 相关阅读:
    uitableview中文排序问题
    跳转到指定页面popToViewController用法
    [__NSCFConstantString size]: unrecognized selector sent to instance 错误
    [NSThread sleepForTimeInterval:3.0];
    XCode 4.3 Unable to load persistent store UserDictionary.sqlite 以及 ios simulator failed to install the application
    ios 6.0模拟器页面调出pop窗口消失后无法使用键盘
    iOS真机测试,为Provisioning添加设备
    [IOS笔记]
    UITableView 滚动时使用reloaddata出现 crash'-[__NSCFArray objectAtIndex:]: index (1) beyond bounds (0)' Crash
    C# 自定义用户控件
  • 原文地址:https://www.cnblogs.com/BlueKevin/p/5457408.html
Copyright © 2020-2023  润新知