过滤器 ( filter ) 就是用于拦截 servlet 传入的请求和传出的响应,以便查看,提取或操作客户机和服务器之间交换的数据
- 过滤器链(FilterChain)
- 某一次请求和响应可以被多个过滤器拦截,这些过滤器就形成过滤器链
- 过滤器链同样在Servlet2.3之后定义,该接口定义为javax. servlet. FilterChain
- Servlet过滤器的特点:
- Servlet过滤器可以检查和修改ServletRequest和ServletResponse对象
- Servlet过滤器可以被指定和特定的URL关联,只有当客户请求访问该URL时,才会触发过滤器
- Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象
- Servlet过滤器的作用:
- 查询请求并作出相应的行动。
- 阻塞请求-响应对,使其不能进一步传递。
- 修改请求的头部和数据。用户可以提供自定义的请求。
- 修改响应的头部和数据。用户可以通过提供定制的响应版本实现。
- 与外部资源进行交互。
- Servlet过滤器的适用场合:
- 认证过滤、登录和审核过滤
- 图像转换过滤、数据压缩过滤
- 加密过滤、令牌过滤
- 资源访问触发事件过滤等
- 与过滤器相关的接口
- javax.servlet.Filter
- javax.servlet.FilterConfig
- javax.servlet.FilterChain
- Filter接口
- 开发过滤器要实现javax.servlet.Filter接口,且要提供一个不带参数的构造方法
- 同时需要实现以下方法:
- public void init(FilterConfig cofing)
- public void doFilter(ServletRequest req,ServletResponse resp)
- public void destroy()
- FilterConfig接口
- 类似于ServletConfig接口
- 用于过滤器初始化期间为其传递信息
- FilterConfig接口由容器实现
- 该接口有以下四个方法
- public String getFilterName() 获取web.xml中指定的过滤器名字
- public String getInitParameter(String name)获取web.xml中的初始化参数值
- public Enumeration getInitParameterNames()获取web.xml中配置的初始化参数名
- public ServletContext getServletContext()获取ServletContext对象
- FilterChain接口
- 过滤器链,该接口由容器实现
- 容器将其对象作为参数传递给过滤器对象的doFilter()
- 过滤器对象使用FilterChain对象调用下一个过滤器,如果当前过滤器是最后一个过滤器,那么调用目标资源
- 该接口只有一个方法:
- public void doFilter(ServletRequest request,ServletResponse response)
- 该方法用于调用过滤器链中的下一个过滤器,如果链中没有其他过滤器的话,就将请求交给目标资源进行处理。
自定义过滤器步骤:
- 自定义过滤器的步骤:
- 实现javax.servlet.Filter接口的servlet类
- 实现init方法,读取过滤器的初始化参数
- 实现doFilter方法,完成对请求或响应的过滤
- 调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应
- 在web.xml中配置Filter
自定义过滤器实例:
- 定义一个简单过滤器,拦截到请求信息时打印简单信息,该请求被目标资源处理完毕之后,打印出简单信息
-
- 在web.xml中对自定义过滤器进行配置,指定该过滤器针对那些资源的请求进行过滤
-
- 定义一个对POST请求中字符数据字符编码的设置的过滤器
-
- 对设置请求字符编码的过滤器在web.xml中进行配置
-
- 定义统一权限验证过滤器
- web应用程序中,某些web资源是受保护的只能是登录且有该资源访问权限用户才能够访问,比如用户中心、订单中心等,此时我们可以定义一个统一权限验证过滤器,该过滤器可以校验登录用户是否有权限访问该资源。
-
- 对用户统一校验的过滤器在web.xml中进行配置
-
过滤器
- 什么是监听器?
- 监听器是专门用于对其他对象身上发生的事件或状态改变进行监视和响应处理的对象。
- 按监听的对象Servlet监听器可以分为如下几类:
- 监听应用程序环境(ServletContext)
- 监听会话对象(HttpSession)
- 监听请求消息对象(ServletRequest)
- ServletContextListener接口
- 用于监听代表Web应用程序的ServletContext对象创建和销毁的事件
- HttpSessionListener接口
- 用于监听Web应用程序中的用户会话HttpSession对象的创建和销毁的事件
- ServletRequestListener接口
- 用于监听Web应用程序中的ServletRequest对象的创建和销毁的事件
自定义监听器:
- HttpSessionListener接口想要在session创建后或者session无效前得到通知,可以实现这个接口,且实现接口的类需要在web.xml中进行配置
- HttpSessionListener有以下两个方法需要实现
- void sessionCreated() 当一个新的Session对象创建时调用这个方法
- void sessionDestroyed() 当一个Session对象摧毁前调用这个方法
- 以在线人数统计为例演示自定义监听器的使用
- 当一个新的Session对象被创建时,那么就新增加一个上线用户
- 当一个Session对象将要被销毁时,那么就有一个在线用户要下线了
- 实现HttpSessionListener接口
- 重写接口中sessionCreated方法
-
- 实现HttpSessionListener接口
- 重写接口中sessionDestroyed方法
-
- 在web.xml中配置监听器
-
- ServletContextListener
- 用于监听ServletContext对象的创建和销毁,因为每一个Web应用程序都会有一个ServletContext对象与其关联
- Web应用程序启动Servlet容器就会为它创建关联的ServletContext对象,Web应用程序停止Servlet容器也会将与它关联的ServletContext对象销毁,所以ServletContextListener可以监听当前Web应用程序的启动和停止事件。
- 开发时,当Web应用程序启动时,可能需要做一些初始化操作,如初始化数据库连接池、初始化线程池、加载项目配置信息等;Web应用停止前,可能需要做一些资源销毁工作,如关闭连接池和线程池等,那么都可以通过实现ServletContext的创建与销毁监听器ServletContextListener接口来显示
- ServletContextListener接口定义了两个方法,当Servlet容器中当前Web应用程序关闭或者启动时会分别调用这两个方法对事件进行处理:
- contextDestroyed 当前web应用程序被关闭时调用该方法
- contextInitialized 当前web应用程序启动时调用该方法
-