Filter Listener 概述 原理 执行流程

来源:互联网 发布:python opengl 教程 编辑:程序博客网 时间:2024/06/04 23:22

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的对象状态改变监听器

原创粉丝点击