Filter Listener 概述 原理 执行流程

Filter与Listener详解
本文深入讲解了Filter的工作原理、生命周期及配置方法,并介绍了如何解决HTTP请求中的乱码问题。此外,还详细阐述了Listener的不同类型及其应用场景。

Filter概述

接受客户端发送过来的请求,然后针对请求进行过滤

FIilter生命周期

  1. TomCat 启动的时候执行 init(FilterConfig fConfig)

  2. 拦截的时候 执行doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

  3. 当TomCat关闭的时候执行 ondestroy

FilterConfig对象

跟SerlvetConfig 对象差不多就是获取下面对应的参数,熟悉API就可以了

  <filter-mapping>
    <filter-name>DemoFilter1</filter-name>
    <url-pattern>/jsp/demo1.jsp</url-pattern>
  </filter-mapping>

执行原理

  1. Filter过滤的器的执行顺序 根据在 web.xml 中配置顺序一致
  2. A—>C chain.doFilter(request, response);后 C—>A

这里写图片描述

Filterchain对象

Interface FilterChain
概述 过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。

Filter-Mapping的配置

关于Request Forward 在Filter来配置的说明 默认是拦截请求 ,配置以后才可以拦截转发

这里写图片描述

关于request forward 等问题

关于HttpServletRequest的动态代理的二次封装

需求 : 对于post get提交的request请求乱码问题 想要通过增强在HttpServletRequest这个类来实现乱码问题的增强。
解决方案 : 继承 装饰 动态代理 三种模式都可以解决,又因为HttpServletRequestWrapper实现了HttpServletRequest这个接口,因此可以通过动态代理的方式来进行增强

增强的类 被装饰的类

public class MyRequestWarpper  extends HttpServletRequestWrapper{


    private HttpServletRequest request;
    public MyRequestWarpper(HttpServletRequest request) {
        super(request);
        this.request = request;
    }
    /**
     * 通过重写这个方式来实现解决乱码问题
     */
    @Override
    public String getParameter(String name) {
        // TODO Auto-generated method stub
        // 1.判断是什么请求
        // 2. get 请求
        // 3. post 请求
        String method = request.getMethod();

        if(method.equalsIgnoreCase("get")) {
            try {    
                String value = new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");

                System.out.println("MyRequestWarpper    " + value);
                return value;
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }else {
            try {
                request.setCharacterEncoding("UTF-8");

            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                }           
        }
        return request.getParameter(name);
    }

}

在Serlvet中的使用

public class MyRequestSerlvet extends HttpServlet {


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        MyRequestWarpper myRequestWarpper = new MyRequestWarpper(request);

        String parameter = myRequestWarpper.getParameter("user");
        String parameter2 = myRequestWarpper.getParameter("pwd");

        System.out.println(parameter);
        System.out.println(parameter2);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

HttpRequest对象的增强

问题汇总

1. 初始运行项目时会报出NotClassfindException 就说定义的filter没有找到 ,

解决办法 去tomcat目录下查看对应的jsp的Classes的没有被编译,手动编译 , 关闭tomcat Project Buildall 手动编译 从新部署项目运行 ok 最直接的办法就是关闭Eclipse重启

2. 注意过滤的对象 还有内容

解决 A 请求 B 过滤器 过滤的是B的内容,配置的是B的路径

Listener 监听器

第一类 监听域对象的变化

ServletContextListener:监听ServletContext对象的创建和销毁

HttpSessionListener:监听HttpSession对象的创建和销毁

ServletRequestListener:监听ServletRequest对象的创建和销毁

第二类 监听域对象属性的变化

ServletContextAttributeListener:监听ServletContext域属性变更的监听器

HttpSessionAttributeListener:监听HttpSession域属性变更的监听器    

ServletRequestAttributeListener:监听ServletRequest域属性变更的监听器

第三类 用来监听HttpSession中的JavaBean的对象状态改变监听器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值