Spring过滤器

 Filter基础

       Filter是servlet规范的三大组件之一。顾名思义,就是过滤。可以在请求到达目标资源之前先对请求进行拦截过滤,即对请求进行一些处理;也可以在响应到到达客户端之前先对响应进行拦截过滤,即对响应进行一些处理。(过滤器可以称为拦截器,但是也有拦截器的专门组件)。总的来说,既可以对请求进行处理,也可以对响应进行处理

Filter的生命周期

        Filter的生命周期与servlet的生命周期类似,其主要生命周期阶段有四个:Filter对象的创建(构造器)、Filter对象的初始化(init())、Filter执行doFilter()方法、及最终Filter对象被销毁(destroy())。

        Filter的整个生命周期过程的执行,由web服务器负责管理。即Filter从创建到销毁整个过程中方法的调用,都是由web服务器负责调用执行,程序员无法控制其执行流程。

过滤器的创建和初始化会在工程启动的时候就进行完成,并且过滤器是单例多线程的

Filter的destroy()方法是在工程停止的时候触发的,也就是在tomcat结束运行触发的

* Filter的doFilter()方法是无论哪个多线程进行访问,该Filter的doFilter都会执行,访问一次执行一次

由于Filter是单例多线程的,为了保证其线程安全性,一般是不为Filter添加可修改的成员变量的。

手动实现基本的过滤器

1.在web.xml中配置过滤器

2.实现servlet中的Filter接口,实现方法,并访问页面查看输出结果

但是有个问题,index页面的内容没有显示,但是后台却输出了doFilter(),说明请求已经到了后台,只是没有进行返回响应

只需要在doFilter()方法中,进行设置,index页面的内容就可以显示了

FilterConfig

        学习过滤器经常会跟servlet一起来进行学习,因为二者具有很多的相似处,在servlet中有ServletConfig,Filter中也有FilterConfig,ServletConfig是对web.xml中servlet配置的一个抽象,同理可推测出FilterConfig就是对web.xml中filter配置的一个抽象。

手动实现FilterConfigDemo

FilterMapping

手动体现FilterMapping效果

1.在web.xml中进行注册servlet和filter方便以后的测试效果

2.实现servelet和filter

3.进行访问并返回结果

web.xml中/*和/在Filter和Servlet中的区别

第一次在地址栏输入http://localhost:8080/03_filterMapping,输出了一次结果

第二次在地址栏输入http://localhost:8080/03_filterMapping /indexhtml,输出了一次结果

第三次在地址栏输入http://localhost:8080/03_filterMapping/index.jsp,没有进行输出,由此可证,动态资源没有访问的资格

FilterMapping中的两种拦截写法

      1.url-pattern

      2.servlet-name

dispatcher的不同参数及含义

多个filter的执行顺序

Servlet的执行原理

        两个map:web容器中存在两个map,这两个map的key均为servlet注册时的<url-pattern/>的值,但value是不同的。第一个map的value是servlet实例对象的引用,第二个map的value为<servlet-class/>的值,即servlet类的全限定性类名。

执行原理:

      当对servlet的请求到达servlet容器时,会先对请求进行解析,使用解析出的URI,作为比较对象,从第一个map中查找是否有相同的key,若存在相同的key,那么读取其value,即servlet对象的引用,执行该servlet的service()方法。

Class.forName(className)

若第二个map中也没有找到同名的key,那么跳转到系统错误处理页面404.

Servelt是访问的时候就启动,filter是工程启动就启动,所以一用filter,它就存在,不用临时创建了

Filter的执行原理

  • 一个数组与一个map
  • 一个map:map的key为<url-pattern>的值,value为filter实例对象的引用
  • 一个数组:存放着与请求相匹配的所有filter

执行原理

       当对某资源的请求到达web容器时,会先对请求进行解析,使用解析出的URI作为比较对象,从map中查找是否存在相匹配的key。若存在,那么读取value,即filter对象的引用,将该引用存入到数组中。然后继续向后查找,直到将该map查找完毕。这样在数组中就会按照查找顺序排列好序的filter引用。数组初始化完毕后,开始按照数组元素顺序进行执行。所有数组中的filter全部执行完毕后,再跳转到请求的目标资源。

中文乱码问题

        Tomcat服务器,在form表单以get方式提交数据的时候,不会出现中文乱码的问题,但是post仍是乱码。使用GET提交时,若请求中携带有中文,为什么会产生乱码?

        当用户提交了一个包含中文参数的请求时,浏览器首先会将这些中文转化为一个字节序列,发送到服务器,服务器接收到这个字节序列,会按照其默认的字符编码ISO8859-1对其进行编码,此时就产生了乱码。接着服务器会将解码过的参数存放到paramterMap中,那么这个Map中的参数已经是乱码了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芦蒿炒香干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值