过滤器和监听器

过滤器监听器

过滤器:

概念:

过滤器是能够对web请求和web响应的头属性和内容体进行操作的一种特殊web组件

过滤器的特殊之处在于本身并不直接生成web响应,而是拦截web请求和响应,以便查看、提取或以某种方式操作客户机和服务器之间交换的数据

过滤器的功能:

分析web请求,对输入数据进行预处理

阻止web请求和响应的进行

根据功能改动请求的头信息和数据体

与其他web资源协作

工作原理:

过滤器的API包插javax.servlet包中的Filter,FilterChain和FilterConfig三个接口

所有的过滤器都必须实现javax.servlet.Filter接口,该接口定义了init()、doFilter()和destory()三个方法

这三个方法分别对应了过滤器生命周期中的初始化、响应和销毁这三个阶段

代码实现:

package com.wp.controller;/*
 *@author wupeng
 *@time 2021/6/23-20:41
实现自定义过滤器:
    完成请求的拦截以及资源的通用管理
    使用方法:
    定义普通java类,实现filter接口
    重写其中的方法:
                init:完成初始化,tomcat启动的时候执行一次
                dofilter:进行处理  每次的发送请求都会执行一次
                destory:销毁功能   tomcat关闭的时候执行
    生命周期:从tomcat启动到tomcat关闭
    filterChina:表示过滤器链,在项目中可以定义N多个过滤器,当开始执行的时候,根据用户请求把符合规则的过滤器挨个执行
    建议:每个过滤器完成独立的功能,不要将所有的逻辑处理放置到同一个过滤器你中,耦合性高,不利于维护
    在过滤器的文本.xml配置文件中,可以指定过滤器过滤哪些请求
        /*.匹配所有请求
        /*.do匹配所有后缀为do的请求
        /filter.do:匹配请求为filter.do的请求

    <filter>
        <filter-name>filter</filter-name>  配置filter的别名
        <filter-class>com.wp.controller.MyFilter</filter-class>  配置filter指定的类名
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>      配置别名与filter上的标签匹配
        <url-pattern>/*</url-pattern>    表示要匹配的请求
    </filter-mapping>
 */

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;


@WebFilter(servletNames = {"/filter"},filterName = "simplefilter")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("filter init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("filter doFilter");
        //添加此语句之后才能调用到对应的servlet
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("filter 处理完毕");

    }
    @Override
    public void destroy() {
        System.out.println("filter destory");
    }
}

小案例:

package com.wp.filter;/*
 *@author wupeng
 *@time 2021/6/23-21:15

 */

import com.sun.deploy.net.HttpResponse;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("登录过滤器的初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("登录过滤器编码处理");
        HttpSession session = ((HttpServletRequest) servletRequest).getSession();
        if(session.getAttribute("user")==null) {
            ((HttpServletResponse)servletResponse).sendRedirect("login.jsp");
        } else {
            filterChain.doFilter(servletRequest,servletResponse);
        }
        System.out.println("登录过滤器编码处理完成");
    }

    @Override
    public void destroy() {
        System.out.println("登录过滤器被销毁");
    }
}
package com.wp.filter;/*
 *@author wupeng
 *@time 2021/6/23-21:12
设置编码过滤器
 */

import javax.servlet.*;
import java.io.IOException;

public class EncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("编码过滤器的初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("编码过滤器的逻辑处理");
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html:charset=utf-8");
        System.out.println("编码过滤器执行完成");

    }

    @Override
    public void destroy() {
        System.out.println("编码过滤器被销毁");
    }
}

监听器:

概念:

Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理

通过实现Servlet API提供的Listense接口,可以在监听正在执行的某一个程序,并且根据程序的需求做出适当的响应

Servlet2.3提供了对ServletContext和HttpSession对象的状态变化的监听器,Servlet2.4则增加了对ServletRequest对象状态变化的监听器

ServletContext对象----监听ServletContext对象,可以使web应用得知web组件的加载和卸载等运行情况

HttpSession对象----监听HttpSession对象,可以使web应用了解会话期间的状态并做出反应

ServletRequest对象----监听ServletRequest对象,可以使web应用控制web请求的生命周期

监听器的类型:

request监听器:

package com.wp.listens;/*
 *@author wupeng
 *@time 2021/6/23-21:28
监听器:监听作用域对象的创建和销毁以及属性的相关配置,可以添加一些公共的属性配置,做逻辑判断
        主要监听三种作用域
        ServletContext(Session)
        Session
        request
        接口有两个: ServletRequestListener(监听request对象的创建和销毁),
          ServletRequestAttributeListener(监听request作用域域属性的添加,删除和更改)
 */

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import java.util.Date;

@WebListener("/listen")
public class MyListense implements ServletRequestListener, ServletRequestAttributeListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        System.out.println("销毁" + new Date());
    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("初始化");
    }

    @Override
    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("属性添加时候的逻辑代码");
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("属性删除时候做的逻辑");
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("属性更改时做的事情");
    }
}

ServletContext:

package com.wp.listens;/*
 *@author wupeng
 *@time 2021/6/23-21:38
    servletContext:
    接口   ServletContextListener监听serxletcontext对象的创建和销毁
            public void contextInitialized(ServletContextBvent servletContextEvent)
            创建对象,当启动 tomcat服务器的时候创建
         public void contextDestroyed(ServletContextEvent servletContextEvent)
    ServletContextAttributeListener监听Servletcontext对象的属性的添加和删除和更改

 */

import javax.servlet.*;

public class MyListense2 implements ServletContextListener, ServletContextAttributeListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("初始化");
    }

HttpSession

package com.wp.listens;/*
 *@author wupeng
 *@time 2021/6/23-21:49
Session:
    HttpSessionListener
           public void sessionCreated(HttpSessionEvent httpSessionEvent)
           session对象创建的时候执行
            public void sessionDestroyed(HttpSessionEvent httpSessionEvent)
            session对象销毁的时候执行
     HttpSessionActivationListener:监听session对象中属性的添加,删除和更改
            public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent)
            添加属性的时候被调用
            public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent)
            删除属性的时候被调用
            public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent)
            更改数据的时候被调用
 */

import javax.servlet.http.*;

public class MyListense3 implements HttpSessionListener, HttpSessionAttributeListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("session对象创建");
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("sessioin对象销毁");
    }
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
    }
    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {

    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {

    }
}

案例:统计当前在线人数

package com.wp.listens;/*
 *@author wupeng
 *@time 2021/6/23-21:49
Session:
    HttpSessionListener
           public void sessionCreated(HttpSessionEvent httpSessionEvent)
           session对象创建的时候执行
            public void sessionDestroyed(HttpSessionEvent httpSessionEvent)
            session对象销毁的时候执行
     HttpSessionActivationListener:监听session对象中属性的添加,删除和更改
            public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent)
            添加属性的时候被调用
            public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent)
            删除属性的时候被调用
            public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent)
            更改数据的时候被调用
 */

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.*;

public class MyListense3 implements HttpSessionListener, ServletContextListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        //获取application对象
        ServletContext context = httpSessionEvent.getSession().getServletContext();
        int count = (int)context.getAttribute("count");
        context.setAttribute("cont",++count);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        //获取application对象
        ServletContext context = httpSessionEvent.getSession().getServletContext();
        int count = (int)context.getAttribute("count");
        context.setAttribute("cont",--count);
    }

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //获取application
        ServletContext sc = servletContextEvent.getServletContext();
        //设置网站在线人数的初始值
        sc.setAttribute("count",0);
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("sevletContext被销毁");
    }
}
posted @ 2021-06-23 22:25  IT小五  阅读(263)  评论(0)    收藏  举报