JavaWeb-servlet6中过滤器和监听器

发布于:2025-03-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

Servlet 过滤器

Servlet 过滤器(Filter)与 Servlet 十分相似,但 Filter 具有拦截客户端请求的功能, Filter 可以改变请求中的内容,以便满足实际开发中的需要。对于程序开发人员而言, Filter 实质上就是 Web 服务器上的一个应用组件,用于拦截客户端与目标资源的请求,并对这些请求进行一定过滤处理再发送给目标资源。如图所示:
在这里插入图片描述
如果一个 Web 应用中使用一个 Filter 不能解决史记中的业务需要,那么可以部署多个过滤器对业务请求进行多次处理,这样就组成了一个过滤器链。Web 容器在处理过滤器链时,将按照过滤器的先后顺序对请求进行处理,如图所示:
在这里插入图片描述

Filter创建过程:

要编写一个过滤器必须实现Filter接口。实现其接口规定的方法。
1、实现jakarta.servlet.Filter接口
2、实现init方法,读取过滤器的初始化参数
3、实现doFilter方法,完成对请求或响应的过滤
4、调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应

创建Filter有两种方式:基于web.xml配置文件、基于@WebFilter注解

基于web.xml
<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.iss.filter.MyFilter</filter-class>
    <init-param>
        <param-name>userName</param-name>
        <param-value>admin</param-value>
    </init-param>
  </filter>
 <filter-mapping>
           <filter-name>MyFilter</filter-name>
            <!-- 配置过滤器 url 映射 -->
          <url-pattern>/*</url-pattern>
          <dispatcher>REQUEST</dispatcher>
  </filter-mapping>
创建filter
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化过滤器");
        System.out.println(filterConfig.getInitParameter("userName"));
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("执行url,进入此方法");
        chain.doFilter(request,response);//进入下一个过滤器或url
    }
    @Override
    public void destroy() {
        System.out.println("关闭服务器时执行");
    }
}
基于@WebFilter注解
@WebFilter(filterName = "myFilter",urlPatterns = "/*",initParams = {@WebInitParam(name="userName",value = "admin")},dispatcherTypes = DispatcherType.REQUEST)public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化过滤器");
        System.out.println(filterConfig.getInitParameter("userName"));
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("执行url,进入此方法");
        chain.doFilter(request,response);//进入下一个过滤器或url
    }
    @Override
    public void destroy() {
        System.out.println("关闭服务器时执行");
    }
}
Filter应用示例 解决乱码问题fitler
@WebFilter(filterName = "charactorFilter", urlPatterns = "/*", initParams = {
        @WebInitParam(name = "encoding", value = "UTF-8") })
public class CharactorFilter implements Filter {
    private String encoding;
    public void init(FilterConfig fConfig) throws ServletException {
        encoding = fConfig.getInitParameter("encoding");
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        if (encoding != null) {
            request.setCharacterEncoding(encoding);
            response.setContentType("text/html;charset=" + encoding);
        }
        chain.doFilter(request, response);
    }
    public void destroy() {
    }
}

Listener介绍

servlet监听器也叫web监听器。是servlet中一种特殊类。能够帮助开发者监听web应用中的特定事件。比如ServletContext,ServletSession,ServletRequest的创建和销毁,变量的创建和销毁等。
监听器常用的用途:
  统计在线人数,利用HttpSessionListener
  加载初始化信息:利用ServletContextListener
  统计网站访问量:利用ServletRequestListener
  实现访问监控:利用ServletRequestListener

Listener分类

在 Servlet 规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext、HttpSession和 ServletRequest这三个域对象。

Servlet 规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:

  1. 监听域对象自身的创建和销毁的事件监听器。
  2. 监听域对象中的属性的增加和删除的事件监听器。
  3. 监听绑定到HttpSession域中的某个对象的状态的事件监听器。
listener应用

ServletContextListener 接口用于监听 ServletContext 对象的创建和销毁事件。
ServletContext 域对象创建和销毁时机:
创建:服务器启动针对每一个Web应用创建 ServletContext;
销毁:服务器关闭前先关闭代表每一个 web 应用的 ServletContext;

@WebListener
public class MyServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext has create ...");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext has destroyed ...");
    }
}