过滤器Filter、监听器Listener


一、Filter

1、过滤器是什么 

Filter过滤器是JavaEE规范,是一个接口
 

2、有什么用

Filter可以在Servlet目标程序执行前添加代码拦截请求,也可以在目标程序执行后添加代码过滤响应
 

3、Filter过滤器体验

没用Filter过滤器时,需要在每个Servlet中加同样的登录判断代码,才能拦截没有登录的用户访问部门列表,用了Filter过滤器后只需要在过滤器中添加一次拦截代码。

没用过滤器拦截时,直接在地址栏输入访问地址,没有登录也可以访问,左上角用户信息为null

 用了过滤器后

 

 直接输入访问部门列表的地址会被拦截跳转到登录界面,登录后才能访问

 

 使用步骤:

1、实现Filter接口,并重新所有的方法

init方法(服务器启动时Filter创建执行一次)

doFilter方法(过滤方法,用户访问时执行)

destroy方法(关闭服务器是Filter销毁执行一次)

2、编写dilterChain.doFilter()方法

public class Filter1 implements Filter {
    @Override
    //Filter对象创建是执行一次
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter1创建");
    }

    @Override
    //用户请求时执行,请求n次执行n次
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        System.out.println("doFilter()执行");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("doFilter()执行完");

    }

    @Override
    //Filter对象销毁时执行一次
    public void destroy() {

        System.out.println("destroy()执行");
    }
}

3、web.xml中配置Filter

 

 

  • Filter执行步骤
    Filter的优先级比Servlet高,在服务器启动时创建Filter对象执行Filter中的init()方法,当用户发送请求时会先执行Filter中的doFilter()方法,然后执行下一个过滤器如果没有,则会执行目标程序(注意:需要在doFilter()中写filterChain.doFilter(servletRequest,servletResponse)否则不会执行),目标程序执行完后会回到上一级Fiter中的doFilter()直到doFilter()执行完。Filter对象销毁时执行destroy()。
    多个过滤器执行顺序:web.xml配置执行顺序是按照<filter-mapping></filter-maping>从上到下执行
     注解是过滤器名称安装字典顺序执行
    过滤器的请求路径和目标程序的请求路径要相符

 

Listener

  • 什么是监听器

    在Servlet中监听器接口都是以Listener结尾,属于Servlet规范中的一员
     
  • 监听器有什么用

    Servlet规范留给程序员的一个特殊时机,当程序员想要在这个特殊时机执行代码时使用监听器
     
  • Servlet规范中有哪些监听器

    jakarta.servlet包下
    ServletContextListener (onteServletCxt对象创建或销毁时执行)

    ServletContextAttributeListener(向ServletContext保存删除替换数据时执行)

    ServletRequestListener
    ServletRequestAttributeListener

    jakarta.servlet.http包下
    HttpSessionListener
    HttpSessionAttributeListener(需要@WebListener标注,只要session中的数据变化就执行相应方法,主要监听session域上对象)

    HttpSessionBindingListener(不需要@WebListener标注,把相应的对象添加到session或从session中删除时执行,比如User类实现了这个监听器,只有User对象保存到session或User对象从session中删除,才会执行相应的方法)

    HttpSessionIdListener
    HttpSessionActivationListener
  • 如何实现一个监听器

    1、编写一个类实现一个监听器接口,并实现里面的方法
    2、在web.xml文件中用<listener><listener-class>含包名的类名</listener-class></listener>
    用注解比较简单@WebListener
    注意:实现HttpSessionBindingListener时不需要进行监听器配置,只需实现即可。
@WebListener
public class MyServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContext对象创建");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContext对象销毁");
    }
}
@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("ServletContext存数据");
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        System.out.println("ServletContext删除数据");
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        System.out.println("ServletContext替换数据");
    }
}
public class User implements HttpSessionBindingListener {
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("绑定数据");

    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("解绑数据");
    }
}

所有监控器中的方法都不需要程序员去调用,当某个特殊的事件发生时,web服务器自动调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值