FilterAndListener

13 篇文章 0 订阅

Filter:过滤器

概念

  • 生活中的过滤器:净水器,空气净化器
  • web中的过滤器,当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能

作用

  • 一般用来拦截一些通用的操作.如:登录验证,统一编码设置,敏感字符过滤…

快速入门

步骤:

  1. 定义一个类,实现Filter接口
  2. 复写方法
  3. 配置(配置拦截路径)
    1. web.xml配置
    2. 注解配置
package per.leiyu.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;


/**
 * @author 雷雨
 * @date 2020/5/17 9:26
 *
 * 过滤器的快速入门
 * 1.创建一个类实心Filter接口(注意导入的包是javax.servlet.Filter)
 * 2.复写方法
 * 3,配置拦截路径
 */
@WebFilter("/*")
public class FilterDemo1 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filterDemo1被执行了....");

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

    }

    @Override
    public void destroy() {

    }
}

过滤器细节:

1.使用web.xml配置拦截路径

和注解方法的配置的作用是一样的

<filter>
  <filter-name>demo1</filter-name>
  <filter-class>per.leiyu.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
  <filter-name>demo1</filter-name>
  <!--表示的是拦截路径 -->
  <url-pattern>/*</url-pattern>
</filter-mapping>

2.过滤器执行过程

拦截前对request资源进行增强------>执行要拦截的资源------->拦截之后对于response资源进行增强

3.过滤器生命周期方法

package per.leiyu.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * @author 雷雨
 * @date 2020/5/17 10:36
 */
@WebFilter(filterName = "FilterDemo3")
public class FilterDemo3 implements Filter {
    public void destroy() {
        //在服务器启动后自动执行,只执行一次,一般用于资源的加载
        System.out.println("filter拦截器执行之前");
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //我们需要拦截器执行的业务逻辑方法写在这里
        System.out.println("filter拦截器执行");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {
        //在服务器关闭时执行,只执行一次,一般用于资源的释放
        System.out.println("filter拦截器执行后");
    }

}

4.过滤器配置详解

4.1拦截路径的配置
  1. 具体的资源路径: 例如/index.jsp 只有访问index.jsp资源时过滤器才会执行
  2. 目录拦截: /user/* 访问/user下的所有资源时,过滤器都会执行
  3. 后缀名拦截: *.jsp 访问所有后缀名为jsp的资源时,过滤器都会被执行
  4. 拦截所有资源: /* 访问所有资源时,过滤器都会被执行
package per.leiyu.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * @author 雷雨
 * @date 2020/5/17 10:46
 *
 *拦截路径的配置方式
 * 1:具体的路径拦截
 */
//@WebFilter("/index.jsp") //具体的路径拦截
//@WebFilter("/user/*")   //目录拦截方式
//@WebFilter(".jsp")     //后缀名拦截方式
@WebFilter("/*")    //拦截所有的资源
public class FilterDemo4 implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("filterDemo4...");
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

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

我们之前的资源的访问方式可以是:

​ 1.发送请求,即直接浏览器向服务器发送请求,

​ 2.请求转发,正在访问浏览器的资源,在浏览器中进行请求转发,直接访问服务器中的资源

而现在用Filter也可以来配置资源被访问的方式(拦截方式),有两种方式

4.2.1注解方式配置拦截方式
  • 设置dispatcherTypes属性:
    1. REQUEST:默认值.浏览器直接请求资源
    2. FORWARD:转发访问资源
    3. INCLUDE:包含访问资源
    4. ERROR:错误跳转资源
    5. ASYNC:异步访问资源
4.2.2web.xml方式配置拦截方式

设置dispatherTypes标签

<filter>
  <filter-name>demo1</filter-name>
  <filter-class>per.leiyu.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
  <filter-name>demo1</filter-name>
  <!--表示的是拦截路径 -->
  <url-pattern>/*</url-pattern>
  <!--dispatherTypes还是5个取值和在注解中的取值是一样的 -->
  <dispatherTypes>REQUEST</dispatherTypes>
</filter-mapping>

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

  • 执行顺序的问题:

如果有两个过滤器,分别为过滤器1和过滤器2

执行顺序:

过滤器1---->过滤器2---->资源执行----->过滤器2----->过滤器1

  • 过滤器先后顺序问题:

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

      如:AFilter 和BFilter ,那么肯定是AFilter过滤器先执行

    2. web.xml:谁定义在上面,谁先执行

案例:登录验证:

需求:

  1. 访问case_filter案例的资源.验证其是否登录
  2. 如果登录了,则直接放行
  3. 如果没有登录,则跳转带登录页面,提示"您尚未登录,请先登录"

Listener监听器

  • web的三大组件之一.

事件监听机制:

  • 事件: 一件事情
  • 事件源 事件发生的地方
  • 监听器: 一个对象
  • 注册监听: 将事件.事件源,监听器绑定在一起.当事件源上发生某个事件后,执行监听器代码

servletContextListener:监听servletContext对象的创建和销毁

  • void contextDestroyed(ServletContextEvent sce):servletContext对象在销毁之前会调用这个方法

  • void contextInitialized(ServletContextEvent sce):servletContext对象在创建后悔调用该方法

    • 一般用于加载资源

    • 步骤:

      1. 获取servletContext对象:servletContext servletcontext = servletContextEvent.getservletContext();

      2. 加载资源文件

        String contextfigLocation = servletContext.getInitParameter(“contextfigLocation.xml”);

      3. 获取真实路径

        Sting realPath = servletContext.getReaPath(contextfigLocation )

      4. 用一个流对象关联(加载进内存

        FileInputStream fis = new FileInputStream(realpath);

实现监听器的步骤:

  1. 定义一个类,实现servletContextListener接口
  2. 复写方法
  3. 配置
    1. web.xml
    2. 注解的配置方式
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炒冷饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值