监听器和过滤器

本文详细介绍了JavaWeb中的监听器和过滤器。监听器用于跟踪Servlet域对象的生命周期,如ServletContext、HttpSession和ServletRequest的创建与销毁,并在特定事件发生时执行相应操作。过滤器则用于拦截请求和过滤响应,例如权限检查和日志记录。文章通过实例展示了监听器和过滤器的编写、配置及生命周期,并讨论了它们在实际应用中的作用和拦截路径设置。
摘要由CSDN通过智能技术生成

一.关于监听器

  • 监听器:监听某个对象的的状态变化的组件
  • 事件源:被监听的对象
  • 监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器
  • 注册监听器:将监听器与事件源进行绑定
  • 响应行为:监听器监听到事件源的状态变化时所涉及的功能代码

二、监听器的编写步骤(重点):

  • 编写一个监听器类去实现监听器接口
  • 复写监听器的方法
  • 需要在web.xml中进行配置

三、监听器有哪些?

ServletContext域中:

ServletContextListener
ServletContextAttributeListener

HttpSession域中:

HttpSessionListener
HttpSessionAttributeListener

ServletRequest域中:

ServletRequestListener
ServletRequestAttributeListener

对象感知监听器:(主体是针对一个对象且不需要在web.xml中配置)

HttpSessionBindingListener
HttpSessionActivationListener

四、监听器使用原理

1. Servlet域的生命周期

  • 何时创建:服务器启动创建
  • 何时销毁:服务器关闭销毁

2.监听的方法

public class MyServletContextListener implements ServletContextListener {
    @Override
    //监听context域对象的创建
    public void contextInitialized(ServletContextEvent sce) {
        //就是被监听的对象---ServletContext
        ServletContext servletContext = sce.getServletContext();
        //getSource就是被监听的对象的通用的方法
        ServletContext source = (ServletContext) sce.getSource();
        System.out.println("Servletcontext已创建");
    }
    //监听Servletcontext域对象的销毁
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("Servletcontext已销毁");    
    }
}

3.配置xml文件

<listener>
    <listener-class>com.listener.create.MyServletContextListener</listener-class>
 </listener>

4.小demo

public class MyServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //开启一个计息任务调度----每天晚上12点 计息一次
        Timer timer = new Timer();
        //task:任务  firstTime:第一次执行时间  period:间隔执行时间
        //timer.scheduleAtFixedRate(task, firstTime, period);
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println("嗨起来");
            }
        } , new Date(), 5000);




        //修改成每晚十二点必嗨
        //1、起始时间: 定义成晚上12点
        //2、间隔时间:24小时
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String currentTime = "2020-10-22 00:00:00";
        Date parse = null;
        try {
            parse = format.parse(currentTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println("嗨起来");
            }
        } , parse, 24*60*60*1000);

    }

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

    }

}

五、什么是过滤器

Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是Servlet 程序、Listener 监听器、Filter 过滤器。
Filter 过滤器它是 JavaEE 的规范,也就是一个接口。
Filter 过滤器它的作用是拦截请求和过滤响应。拦截请求常见的应用场景有权限检查、日记操作、事务管理等等。

六、Filter过滤器的使用

1、编写一个类去实现 Filter接口,并实现过滤方法 doFilter()

public class AdminFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        Object user = session.getAttribute("user");

        // 如果等于 null,说明还没有登录
        if (user == null) {
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
            return;
        }else {
            // 让程序继续往下访问用户的目标资源
            filterChain.doFilter(servletRequest,servletResponse);
        }

    }

    @Override
    public void destroy() {

    }
}

2、web.xml 中配置 Filter 的拦截路径

    <filter>
        <filter-name>AdminFilter</filter-name>
        <filter-class>filter.AdminFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AdminFilter</filter-name>
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

3、编写LoginServlet 程序

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html; charset=UTF-8");

        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if ("asd".equals(username) && "111".equals(password)){
            request.getSession().setAttribute("user",username);

            response.getWriter().write("登录成功");
        }else {
            request.getRequestDispatcher("/login.jsp").forward(request,response);
        }
    }

七、Filter的生命周期

  • 构造器方法init()方法在web工程启动时就会被执行,此时filter过滤器已经被创建。
  • 每次拦截到请求时,就会执行doFilter()方法。
  • 在停止web工程时,就会执行destroy()方法,此时会销毁filter过滤器。
public class AdminFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        Object user = session.getAttribute("user");

        // 如果等于 null,说明还没有登录
        if (user == null) {
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
            return;
        }else {
            // 让程序继续往下访问用户的目标资源
            filterChain.doFilter(servletRequest,servletResponse);
        }

    }

    @Override
    public void destroy() {

    }
}

八、Filter的拦截路径

1、精确匹配

<url-pattern>/index.jsp</url-pattern>

2、目录匹配

<url-pattern>/admin/*</url-pattern>

3、后缀名匹配

<url-pattern>*.html</url-pattern>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值