JavaWeb中的过滤器和监听器(带实例)

过滤器

过滤器概述

1.过滤器位于客户端与web应用程序之间,用于检查和修改两者之间流过的请求。

2.在请求到达Servlet/JSP之前,过滤器截获请求。

3.作用:在客户端的请求访问后端资源之前,拦截这些请求(添加处理)。

过滤器相关API

Servlet API(javaEE)中,与过滤器相关的API共有三个接口,分别是

-Filter

-FilterChain

-FilterConfig

Filter接口

Fileter接口是过滤器类必须实现的接口,该接口中有三个方法。

1.init(FilterConfig filterConfig):该方法是对filter对象进行初始化的方法,仅在容器初始化filter对象结束后被调用一次。参数FilterConfig可以获得filter的初始化参数。如果没有初始化的操作可以不重写。

//获取web.xml中的配置的有关过滤器的初始化内容
filterConfig.getInitParameter("name");

2.doFilter(ServletRequest request,ServletRespone response,FiltrerChain chain):该方法是filter进行过滤操作的方法,是最重要最核心的方法。过滤器实现类必须实现该方法。方法体中可以对request和response进行预处理。其中FilterChain可以将处理后的request和response对象传递到过滤链上的下一个资源。

三个参数的使用

ServletRequest request:一般需要向下转型为HttpServletRequest,使用request的方法;
ServletRespone response:一般需要向下转型为HttpServletResPonse,使用response的方法;
Chain.doFilter(servletRequest, servletResponse):将处理后的request和response对象传递到过滤链上的下一个资源。

3.destroy():该方法在容器销毁过滤器前被调用,可以不重写调用父类使用。

FilterChain接口

该接口类作为Filter接口中doFilter方法的参数使用。

方法

doFilter(ServletRequest request,ServletResponse response)

该方法可以将当前的请求和响应传递到过滤链的下一个资源,可能是下一个过滤器,也可能是目标资源.

FilterConfig接口

该接口类型作为Filter接口的init方法的参数使用,FilterConfig接口中有一个常用方法

getInitParameter(String name)

该方法用来获得过滤器的初始化参数值。

在web.xml中,可以为每一个filter配置需要的初始化参数,与Servlet的< init-param>类似。过滤器的初始化参数即可通过FilterConfig中的getInitParameter()方法获取。这里的配置通过后面的案例进行展示。

案例(统一编码过滤器)

Java代码
import javax.servlet.*;
import java.io.IOException;

public class EncodingFilter implements Filter {
    String encoding;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("统一编码过滤器");
        encoding = filterConfig.getInitParameter("encodingName");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //所有请求的编码格式都设置为utf-8
        servletRequest.setCharacterEncoding(encoding);
        //让本次请求继续向下执行,可能是下一个过滤器,也可能是目标资源(要访问的servlet或者jsp)
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
web.xml配置文件
 <!--统一编码过滤器配置-->
    <filter>
        <filter-name>encodFilter</filter-name>
        <filter-class>com.ff.jsppro.filter.EncodingFilter</filter-class>
        <!--初识化init的配置参数-->
        <init-param>
            <param-name>encodingName</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodFilter</filter-name>
        <!-- /* 表示所有的请求都经过此过滤器-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

过滤器总结

1.过滤器用来实现通用的功能,减少代码冗余,提高可维护性。

2.一个过滤器可以配置给多个资源使用(编码过滤器)。

3.一个资源也可以配置多个过滤器(success.jsp),按照配置顺序调用。

监听器

Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中属性发生修改的事件。

监听器分类

1.按监听对象分类

(1)用于监听应用程序对象(ServletContext)

(2)用于监听用户会话对象(HttpSession)

(3)用于监听请求消息对象(ServletRequest)

2.按监听事件分类

(1)监听对象的创建和销毁的事件监听器。

(2)监听对象属性变更(添加、修改、删除)的监听器。

监听器接口

Servlet API中定义了监听器接口,用来监听不同的事件类型。

ServletContextListener:上下文监听器;
ServletContextAttribute:上下文属性监听器;
ServletRequestListener:请求监听器;
ServletRequestAttributeListener:请求属性监听器;
HttpSessionListener:会话监听器;
HttpSessionAttribute:会话属性监听器.
配置监听器类

创建监听器类,实现监听器接口,在web.xml文件中配置监听器类。

<listener>
	<listener-class>监听器类全类名</listener-class>
</listener>

实例

监听器类(java代码)

package com.cwd.jsppro.listener;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;

public class ObjectListener implements ServletContextListener, ServletRequestListener {
    /*
    监听ServletContext对象的创建
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext创建了");
        ServletContext application = sce.getServletContext();//整个应用程序只有一个对象
        application.setAttribute("config","123");//设置初始化数据
    }

    /*
    监听ServletContext对象的销毁
     */
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext销毁了");
    }

    /*
   请求对象创建
    */
    long s = 0;
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("请求对象创建");
        s = System.currentTimeMillis();
    }

    /*
    请求对象销毁
     */
    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("请求对象销毁");
        //获取客户端ip
        HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
        System.out.println(request.getRemoteAddr()+"请求耗时:::"+(System.currentTimeMillis()-s));
    }
}

配置web.xml监听器类

<!--监听器配置-->
<listener>
	<listener-class>com.ff.jsppro.listener.ObjectListener</listener-class>
</listener>
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值