1.过滤器和拦截器的区别
1)原理不同:拦截器是基于java的反射机制,而过滤器是基于函数回调
2)作用对象不同:拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
3)调用次数不同:在action的生命周期,拦截器可以多次被调用,而过滤器只能在容器初始化
时被调用一次
4) 拦截器不依赖于servlet容器,过滤器依赖于servlet容器
5) 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问
6)拦截器可以获取IOC容器中的各个bean,而过滤器不行,这点很重要,在拦截器里注入一个
service,可以调用业务逻辑。
2.描述
过滤器是javaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入servlet之
前进行预处理,并且在请求结束返回个前端这之间进行后期处理。
拦截器是被包裹在 过滤器之中的。
总结:拦截器主要在请求权限鉴定方面有很大用处。
3.过滤器的概念
--过滤器在请求与响应的哪个阶段发挥作用
--多个过滤器的使用
3.1 什么样的需求让过滤器出现?
1)针对所有的servlet,产品经理想要了解从请求到响应之间的时间差
2)针对某些特定给的页面,客户希望只有特定几个用户才可以浏览
3)基于安全方面的考虑,用户输入的特定字符必须过滤并替换为无害的字符
4)请求与响应的编码从Big5改用UTF-8
3.1.1 分析这些需求:
运行servlet的service前,记录起始时间,servlet的service的方法运行后,记录结束时间并计算时间差
运行servlet的service前,验证是否为允许的用户
运行servlet的service前,对请求参数尽心字符过滤与替换
运行servlet的service前,对请求和响应对象设置编码格式
总结:经过分析,发现这些需求,可以在真正运行servlet的service方法前与servlet的service
方法后中间进行实现。
3.1.2 这些需求有哪些?
1)5)性能评测(开发阶段才需要,上线后去掉):例如计算时间差
2)用户验证
3)字符替换
4)编码转换
5)压缩--->响应
这类的需求应该设计为独立的元件,随时可以加入到应用程序当中,也随时可以移除,或随时
可以修改设置而不用修改原有的程序。
---->servlet/jsp提供过滤器机制让你实现这些元件服务
3.1.3 灵活的使用规则
1)可以根据需求替换过滤器或调整过滤器的顺序
2)也可以针对不同的url使用不同的过滤器
3)甚至在不同的servlet间请求转发或包含是使用过滤器
4.实现和设置过滤器
如何编写一个过滤器
1)必须实现Filter接口
该接口只有一个方法:boolean isLoggable(LogRecord record) 检查是否应该发布给定的日志记录。
init(FilterConfig filterConfig)
filterConfig:类似于servlet接口init()方法参数上的ServletConfig,代表过滤器在web.xml
中配置的信息。
doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
· 类似于servlet接口的service()方法,在请求来到容器,容器发现调用Servlet的service之前,
可以应用某个过滤器,调用它的doFilter方法。
执行完doFilter()后,决定是否决定调用FilterChain的doFilter()方法
如果调用FilterChain的doFilter()方法,就会执行下一个过滤器;如果没有
下一个过滤器,就调用请求目标servlet的service()。
如果因为某个情况(例如用户没有通过验证)而没有调用FilterChain的doFilter()
则请求不会继续交给接下来的过滤器或目标servlet,这就是所谓的拦截请求(拦截器)。
只需要知道FilterChain运行后会以堆栈顺序返回即可。
destroy()
1)原理不同:拦截器是基于java的反射机制,而过滤器是基于函数回调
2)作用对象不同:拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
3)调用次数不同:在action的生命周期,拦截器可以多次被调用,而过滤器只能在容器初始化
时被调用一次
4) 拦截器不依赖于servlet容器,过滤器依赖于servlet容器
5) 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问
6)拦截器可以获取IOC容器中的各个bean,而过滤器不行,这点很重要,在拦截器里注入一个
service,可以调用业务逻辑。
2.描述
过滤器是javaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入servlet之
前进行预处理,并且在请求结束返回个前端这之间进行后期处理。
拦截器是被包裹在 过滤器之中的。
总结:拦截器主要在请求权限鉴定方面有很大用处。
3.过滤器的概念
--过滤器在请求与响应的哪个阶段发挥作用
--多个过滤器的使用
3.1 什么样的需求让过滤器出现?
1)针对所有的servlet,产品经理想要了解从请求到响应之间的时间差
2)针对某些特定给的页面,客户希望只有特定几个用户才可以浏览
3)基于安全方面的考虑,用户输入的特定字符必须过滤并替换为无害的字符
4)请求与响应的编码从Big5改用UTF-8
3.1.1 分析这些需求:
运行servlet的service前,记录起始时间,servlet的service的方法运行后,记录结束时间并计算时间差
运行servlet的service前,验证是否为允许的用户
运行servlet的service前,对请求参数尽心字符过滤与替换
运行servlet的service前,对请求和响应对象设置编码格式
总结:经过分析,发现这些需求,可以在真正运行servlet的service方法前与servlet的service
方法后中间进行实现。
3.1.2 这些需求有哪些?
1)5)性能评测(开发阶段才需要,上线后去掉):例如计算时间差
2)用户验证
3)字符替换
4)编码转换
5)压缩--->响应
这类的需求应该设计为独立的元件,随时可以加入到应用程序当中,也随时可以移除,或随时
可以修改设置而不用修改原有的程序。
---->servlet/jsp提供过滤器机制让你实现这些元件服务
3.1.3 灵活的使用规则
1)可以根据需求替换过滤器或调整过滤器的顺序
2)也可以针对不同的url使用不同的过滤器
3)甚至在不同的servlet间请求转发或包含是使用过滤器
4.实现和设置过滤器
如何编写一个过滤器
1)必须实现Filter接口
该接口只有一个方法:boolean isLoggable(LogRecord record) 检查是否应该发布给定的日志记录。
init(FilterConfig filterConfig)
filterConfig:类似于servlet接口init()方法参数上的ServletConfig,代表过滤器在web.xml
中配置的信息。
doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
· 类似于servlet接口的service()方法,在请求来到容器,容器发现调用Servlet的service之前,
可以应用某个过滤器,调用它的doFilter方法。
执行完doFilter()后,决定是否决定调用FilterChain的doFilter()方法
如果调用FilterChain的doFilter()方法,就会执行下一个过滤器;如果没有
下一个过滤器,就调用请求目标servlet的service()。
如果因为某个情况(例如用户没有通过验证)而没有调用FilterChain的doFilter()
则请求不会继续交给接下来的过滤器或目标servlet,这就是所谓的拦截请求(拦截器)。
只需要知道FilterChain运行后会以堆栈顺序返回即可。
destroy()