Java Web学习十八:Filter与Listener

一:Filter过滤器

Filter顾名思义,web中的过滤器,是在服务器中的资源被访问时,Filter会将请求拦截下来,完成特殊的功能。一般用于完成通用的操作,如:登录验证,统一编码处理,敏感字符的过滤…

1.如何配置过滤器?

(1)IDEA支持用注解来配置拦截路径,例如 @WebFilter("/*") //访问所有资源之前,都会执行该过滤器

(2)web.xml配置:Filter与Servlet一样,web中用web,xml中同样的可以配置,格式与Servlet也是一般

<filter>
    <filter-name>demo1</filter-name>
<!--        Filter所在位置-->
    <filter-class>cn.itcast.web.filter.FilterDome1</filter-class>
</filter>

<filter-mapping>
    <filter-name>demo1</filter-name>
<!--        拦截路径-->
    <url-pattern>/*</url-pattern>
</filter-mapping>

2.Filter执行的流程(doFilter中的执行过程)

(1)执行过滤器

(2)执行放行后的资源 filterChain.doFilter(servletRequest,servletResponse);放行是指允许访问该资源

(3)回来执行放行代码下边的代码

代码如下:

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    //对request对象请求消息进行增强
    System.out.println("FilterDome执行...");

    //放行
    filterChain.doFilter(servletRequest,servletResponse);

    //对response对象的响应消息进行增强
    System.out.println("FilterDome再次的执行");
}

注意:连续访问资源时,每次都会执行Filter中的doFilter方法

3.Filter的生命周期

Filter中默认有init doFilter destroy 三个需要复写的方法,故它的生命周期

1.init

是在服务器启动后,会创建一个Filter对象,然后调用init方法,init方法只执行一次 用于加载资源

2.doFilter

每一次请求(访问资源时)被拦截时,会执行,并且doFilter方法会被执行多次(拦截几次执行几次)

3.destroy

在服务器关闭后,Filter对象也被销毁掉 ,服务器正常关闭的话会执行destory方法,只执行一次,来释放资源

4.Filter拦截配置详解

*拦截路径配置:

(1)具体的资源路径:/index.jsp 只有访问index.jsp资源的时候,Filter才会被执行

(2)拦截目录(某一目录下所以的资源):/user/ 只有访问/user下的资源时,Filter都会被执行*

(3)后缀名的拦截:*.jsp 访问所有后缀名为jsp的资源时,Filter都会被执行

(4)拦截所有的资源:/* 访问所有的资源时,Filter都会被执行

*拦截方式的配置:资源被访问的方式

*IDEA的注解配置:

    *设置dispatcherTypes的属性

      (1)REQUEST:为dispatchTypes的默认值,浏览器直接请求资源。
      
      (2)FORWARD:转发来访问资源

      (3)INCLUDE:包含访问资源

      (4)ERROR:错误跳转资源

      (5)ASYNC:异步访问资源


例如 @WebFilter(value = “/index.jsp”,dispatcherTypes = DispatcherType.REQUEST ),浏览器直接请求index.jsp资源时,访问所以资源都会执行该过滤器

还可以叠加 @WebFilter(value = “/index.jsp”, {DispatcherType.REQUEST,DispatcherType.FORWARD} )浏览器直接请求或者转发访问index.jsp资源时,访问所以资源都会执行该过滤器

*web.xml配置:

    * 设置<dispatcher></dispatcher>标签即可

5.过滤器链(配置了多个过滤器)

(1)执行顺序:如果有两个过滤器:过滤器1和过滤器2

  1. 过滤器1

  2. 过滤器2

  3. 资源执行

  4. 过滤器2

  5. 过滤器1

注:类似于递归调用


2) 过滤器先后顺序问题:

1. 注解配置:按照类名的字符串比较规则比较,值小的先执行

  • 如: AFilter 和 BFilter,AFilter就先执行了。
  1. web.xml配置: 谁定义在上边,谁先执行。

二:Filter使用案例

1.登录验证

  • 需求:
  1. 访问day17_case案例的资源。验证其是否登录

  2. 如果登录了,则直接放行。

  3. 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。

    1. 案例2_敏感词汇过滤
  • 需求:
  1. 对day17_case案例录入的数据进行敏感词汇过滤

  2. 敏感词汇参考《敏感词汇.txt》(一个自建的敏感词汇的文档)

  3. 如果是敏感词汇,替换为 ***

  • 分析:
  1. 对request对象进行增强。增强获取参数相关方法

  2. 放行。传递代理对象

  • 增强对象的功能:

  • 设计模式:一些通用的解决固定问题的方式

例:联想代理商卖电脑

  1. 装饰模式

  2. 代理模式

  • 概念:
  1. 真实对象:被代理的对象

2. 代理对象:

3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的

  • 实现方式:
  1. 静态代理:有一个类文件描述代理模式

  2. 动态代理:在内存中形成代理类

  • 实现步骤:
  1. 代理对象和真实对象实现相同的接口

2. 代理对象 = Proxy.newProxyInstance();

3. 使用代理对象调用方法。

  1. 增强方法
  • 增强方式:
  1. 增强参数列表

  2. 增强返回值类型

  3. 增强方法体执行逻辑

    实现案例:敏感词汇在这里插入图片描述

    增强getParameter方法,使得是敏感词汇时,会显示***

三:Listener监听器

1.概念:web的三大组件(servlet,filter,listener)之一

(1)事件监听机制

事件:一件事情

事件源:事件发生(进行)的地方

监听器:一个创建的对象

注册监听:将事件,事件源,监听器绑定在一起,当事件源发生某个事件后,执行监听器代码

(2)ServletCpntextListener:监听ServletContext对象的创建和销毁

方法:

void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法

void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法

步骤:

1.定义一个类,实现ServletContextListener接口,并复写起方法

2,配置

(1)web.xml

      <listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>

指定初始化参数

(2)IDEA注解

发布了47 篇原创文章 · 获赞 18 · 访问量 4883

猜你喜欢

转载自blog.csdn.net/qq_43605085/article/details/96478527