过滤器(Filter)

过滤器是JavaWeb三大组件之一(servlet,filter,listener),它与Servlet很相似!不过servlet是用来处理请求,而过滤器是用来过滤请求的。拥有对目标资源的请求和响应进行截取的功能。
image.png

功能:处理程序的公共部分,例如:全站编码

过滤器实现方式

其实过滤器与Servlet很相似,具体如下:

  • 实现Filter接口,重写里面抽象方法
  • 配置web.xml配置文件

步骤一

创建类,实现Filter接口,重新里面的三个方法

  1. public class AFilter implements Filter {
  2. public void destroy() {
  3. System.out.println("销毁过滤器");
  4. }
  5. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  6. System.out.println("处理过滤器...");
  7. chain.doFilter(request, response);
  8. }
  9. public void init(FilterConfig fConfig) throws ServletException {
  10. System.out.println("初始化过滤器");
  11. }
  12. }

步骤二
配置web.xml,类似servlet

  1. <filter>
  2. <filter-name>AFilter</filter-name>
  3. <filter-class>com.hzit.filter.AFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6. <filter-name>AFilter</filter-name>
  7. <!-- 需要过滤的路径 该路径表示拦截所有请求 -->
  8. <url-pattern>/*</url-pattern>
  9. </filter-mapping>

生命周期

从上面代码可以看出,继承Filter接口之后实现三个方法,和servlet生命周期类似:

  • 实例化对象
  • 初始化,调用init()
  • 处理方式,调用doFilter()
  • 销毁,调用destroy()

注意:doFilter(ServletRequest,ServletResponse)方法,如果不调用FilterChain的doFilter()方法,那么目标资源将无法执行;

同时配置多个过滤器

可以为一个请求,配置多个过滤器,其中顺序按照web.xml配置的顺序进行加载

案例

  • 统一处理全站乱码;
  • 验证页面是否登录;
    • 如果登录了正常访问,
    • 如果没有登录跳转到登录界面。

1.判断登录的依据,判断session里面是否包含了用户信息
2.如果包含证明登录成功,否则没有登录,

监听器

用来监听域对象的创建销毁以及域对象属性的操作;

在JavaWeb被监听的事件源为:ServletContext(application)HttpSession、ServletRequest,即三大域对象。
总共八个监听器,监听域对象相关的操作

监听器的对象和方法的调用都是由服务器自己调用,不能手动参与。

ServletContextListener监听器

用来监听ServletContext域对象的创建和销毁的监听器。

  • 创建:在服务器启动的时候,为每个web应用创建单独的ServletContext 对象

  • 销毁:在服务器关闭的时候,或者项目从web服务器中移除的时候。

**在web.xml中去配置:如下代码即可绑定监听器

  1. <listener>
  2. <listener-class>com...ApplicationAttrListener</listener-class>
  3. </listener>


代码演示:

  1. package com.listener.listener;
  2. import javax.servlet.ServletContextEvent;
  3. import javax.servlet.ServletContextListener;
  4. public class ApplicationAttrListener implements ServletContextListener{
  5. @Override
  6. public void contextDestroyed(ServletContextEvent sce) {
  7. System.out.println("ServletContext对象被销毁了。。");
  8. }
  9. @Override
  10. public void contextInitialized(ServletContextEvent sce) {
  11. System.out.println("ServletContext对象被创建了。。");
  12. }
  13. }

用途:

  1. 加载框架的配置文件。例如:Spring框架提供了一个核心监听器 ContextLoaderListener。<br />定时任务调度,例如过生日给你发祝贺邮件<br />

HttpSessionListener监听器

监听HttpSession对象的创建和销毁。

  • 创建:服务器端第一次调用getSession()方法时候。
  • 销毁:非正常关闭服务器 (正常关闭服务器session会被序列化)。点击terminate(强制关机)就会销毁,但是看不见销毁信息

Session过期(默认过期时间30分钟)。
手动调用session.invalidate()方法。


**web.xml配置方式同上

代码演示:

  1. import javax.servlet.http.HttpSessionEvent;
  2. import javax.servlet.http.HttpSessionListener;
  3. public class MyHttpSessionListener implements HttpSessionListener{
  4. @Override
  5. public void sessionCreated(HttpSessionEvent se) {
  6. System.out.println("HttpSession对象被创建了。。");
  7. }
  8. @Override
  9. public void sessionDestroyed(HttpSessionEvent se) {
  10. System.out.println("HttpSession对象被销毁了。。");
  11. }
  12. }

ServletRequestListener监听器

用户监听ServletRequest 对象的创建和销毁

  • 创建: 从客户端向服务器发送一次请求, 服务器就会创建request对象。

  • 销毁: 服务器对这次请求作出了响应之后,request 对象就销毁了。

web.xml配置方式同上

代码如下:

  1. import javax.servlet.ServletRequestEvent;
  2. import javax.servlet.ServletRequestListener;
  3. public class MyServletRequestListener implements ServletRequestListener{
  4. @Override
  5. public void requestDestroyed(ServletRequestEvent sre) {
  6. System.out.println("ServletRequest对象被销毁了。。。");
  7. }
  8. @Override
  9. public void requestInitialized(ServletRequestEvent sre) {
  10. System.out.println("ServletRequest对象被创建了。。。");
  11. }
  12. }

案例:统计当前在线人数

思路:

  • 当服务器启动的时候需要有一个初始值为0
  • 当浏览器访问服务端创建sessionl,获得初始值并+1
  • 当session销毁初值就减-1.