java-web 过滤器 & 监听器 & 拦截器

Tomcat 的容器分为四个等级。真正管理 Servlet 的容器是 Context 容器,一个 Context 对应一个 Web 工程。在 Tomcat 的配置文件里能够非常easy发现这一点。例如以下:
Context 配置參数

<Context path="/projectOne " docBase="D:\projects\projectOne" 
 reloadable="true" />

servlet规范
servlet/filter/listener/interceptor差别与联系
http://blog.csdn.net/sundenskyqq/article/details/8549932
http://hejiajunsh.iteye.com/blog/1776571
监听器
application:上下文对象,是由容器创建和初始化的,它的范围是整个的web应用,并且整个web应用中仅仅会有一个 application对象存在。当webserver关闭时。就会将application对象销毁
session:是一种保存上下文信息的机制,它是针对每一个会话的。它是放在server端。通过SessionId区分的,在浏览器和server结束后,都会将session销毁
request对象:是当client发送请求时,容器就会创建一个ServletRequest对象,来进行封装请求数据,同一时候会创建一个servletResponse对象来进行封装对应数据,当结束封装请求之后,就会销毁该对象
WEB监听器。就是监听这3个对象的创建,销毁,和它们的属性发生的变化
用途:统计在线人数、统计訪问量、系统变量初始化、Spring

使用:
1. 创建 继承对应的接口
2. web.xml中注冊
一个application、HttpSession、ServletRequest都能够有多个监听器
ServletContext 全局一个,使用context-Parm的全局參数。容器启动结束时使用。
HttpSession 多个,HttpSessionListener能够有多个。创建销毁时运行
Web.xml中设置session超时等属性
对监听域中的属性(Attribute之间传值,放在request域中,parameter是參数)增删监听
HttpSession 绑定就是setAttribute() 钝化活化是由于session太多了,内存不够用。序列化到文件。重载时自己主动载入。
1. 域对象
session/request/application
2.事件
创建/销毁/属性变更/servlet状态改变
3.顺序
监听器->过滤器->Servlet
PS:Webx、Struts都通过filter注入。由于这样够灵活

  1. 通过控制对chain.doFilter的方法的调用,来决定是否须要訪问目标资源。


    比方,能够在用户权限验证等等。推断用户是否有訪问某些资源的权限。有权限放行,没权限不运行chain.doFilter方法。

  2. 通过在调用chain.doFilter方法之前,做些处理来达到某些目的。
    比方,解决中文乱码的问题等等。能够在doFilter方法前,运行设置请求编码与响应的编码。甚至能够对request接口进行封装装饰来处理get请求方式的中文乱码问题(重写对应的request.getParameter方法)。
  3. 通过在调用chain.doFilter方法之后,做些处理来达到某些目的。
    比方对整个web站点进行压缩。在调用chain.doFilter方法之前用类A对response对象进行封装装饰,重写getOutputStream和重写getWriter方法。在类A内部中,将输出内容缓存进ByteArrayOutputStream流中,然后在chain.doFilter方法运行后,获取类A中ByteArrayOutputStream流缓存数据,用GZIPOutputStream流进行压缩下。

过滤器

过滤器的运行流程依照filter-mapping的顺序,当中filterChain是兴许要运行的过滤器
Init和destory 是容器初始化/销毁时运行,仅一次。
过滤器的运行流程:
运行第一个过滤器的chain.doFilter()之前的代码——>第二个过滤器的chain.doFilter()之前的代码——>……——>第n个过滤器的chain.doFilter()之前的代码——>所请求servlet的service()方法中的代码——>所请求servlet的doGet()或doPost()方法中的代码——>第n个过滤器的chain.doFilter()之后的代码——>……——>第二个过滤器的chain.doFilter()之后的代码——>第一个过滤器的chain.doFilter()之后的代码。


拦截器

拦截器是指通过统一拦截从浏览器发往server的请求来完毕功能的增强
使用场景:解决请求的共性问题(乱码问题、权限验证问题

拦截器的基本工作原理
1.SpringMVC能够通过配置过滤器来解决乱码问题
2.拦截器的工作原理和过滤非常类似

拦截器的实现
1.编写拦截器类实现HandlerInterceptor接口
三个必须实现的方法
preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2)
(第一步:在请求被处理之前进行调用 是否须要将当前的请求拦截下来,假设返回false,请求将会终止。返回true,请求将会继续
Object arg2表示拦截的控制器的目标方法实例)

postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2。ModelAndView arg3)
(第二步:在请求被处理之后进行调用ModelAndView arg3是指将被呈如今网页上的对象,能够通过改动这个对象实现不同角色跳向不同的网页或不同的消息提示)

afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,Exception arg3)
(第三步:在请求结束之后调用 一般用于关闭流、资源连接等 比較少用)

2.将拦截器注冊进SpringMVC框架中

<mvc:interceptors>
    <bean class="xxx"></bean>
</mvc:interceptors>

3.配置拦截器的拦截规则
配置部分路径请求

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/xxx" /> <!-- 仅仅拦截匹配的路径 -->
        <bean class="xxx"></bean>
    </mvc:interceptor>
</mvc:interceptors>
posted on 2017-08-05 08:33  blfbuaa  阅读(299)  评论(0编辑  收藏  举报