Filter+Listener核心技术

212 阅读3分钟

一.Filter过滤器

1.1 Filter基本概念

Filter本意为”过滤“的含义,是JavaWeb的三大组件之一,三大组件为:Servlet、Filter、 Listener。

过滤器是向 Web 应用程序的请求和响应处理添加功能的 Web 服务组件。

过滤器相当于浏览器与Web资源之间的一道过滤网,在访问资源之前通过一系列的过滤器对请求 进行修改、判断以及拦截等,也可以对响应进行修改、判断以及拦截等。

1.2 工作方式:

image.png

1.3 定义方式:

image.png chain.doFilter(request,response)相当于放行.

配置Filter在web.xml文件中

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.lagou.demo01.LoginFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/main.jsp</url-pattern>
</filter-mapping>

1.4 Filter接口

javax.servlet.Filter接口主要用于描述过滤器对象,可以对资源的请求和资源的响应操作进行筛选操作。

常用方法:

image.png

image.png

1.5 FilterConfig接口

javax.servlet.FilterConfig接口主要用于描述过滤器的配置信息。

常用方法:

image.png getFilterName 获取过滤器名称:

System.out.println("获取到的过滤器名称为:" + filterConfig.getFilterName());

getInitParametr(String name) 获取初始化参数信息:

String userName = filterConfig.getInitParameter("userName");

Enumeration getInitParameterNames获取初始化操作名称(如果数据很多):

while (initParameterNames.hasMoreElements()) {
   // userName password
   System.out.println("获取到的初始化参数名为:" + initParameterNames.nextElement());
}

getServletContext 获取ServletContext对象:

ServletContext servletContext = filterConfig.getServletContext();
System.out.println("获取到的上下文对象是:" + servletContext);

1.6 多个过滤器的使用

image.png

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    System.out.println("这是第一道防线!");
    filterChain.doFilter(servletRequest, servletResponse);
    System.out.println("第一道防线返回!");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    System.out.println("这是第二道防线!");
    filterChain.doFilter(servletRequest, servletResponse);
    System.out.println("第二道防线返回!");
}

在web.xml配置文件中我们配置了两个过滤器的映射,B过滤器在前. image.png 我们运行一下:

image.png

根据后台的回馈可以看出b过滤器在a过滤器之前被调用。

1.7 过滤器优点

实现代码的“可插拔性”,即增加或减少某个功能模块,不会影响程序的正常执行。

可以将多个相同处理逻辑的模块集中写在过滤器里面,可实现重复利用、也方便代码的维护。

1.8 用过滤器解决登陆问题:

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    // 1.实现对用户访问主页面的过滤操作,也就是只有用户登录后才能访问主页面,否则一律拦截
    // 判断session中是否已有用户名信息,若没有则进行拦截,否则放行
    HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
    HttpSession session = httpServletRequest.getSession();
    Object userName = session.getAttribute("userName");
    // 获取Servlet的请求路径
    String servletPath = httpServletRequest.getServletPath();
    // 若没有登录,则回到登录页面
    if (null == userName && !servletPath.contains("login")) {
        servletRequest.getRequestDispatcher("login.jsp").forward(servletRequest, servletResponse);
    } else {
        // 若已经登录,则放行
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

二.Listener监听器

2.1 基本概念

Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理。

容器产生的事件分类如下:

生命周期相关的事件。

属性状态相关的事件。

存值状态相关的事件。

底层原理是采用接口回调的方式实现。

2.2 基本分类

image.png

2.3 监听器详解

1 ServletRequestListener监听器

image.png

2 ServletRequestAttributeListener监听器

image.png

3 HttpSessionListener监听器

image.png

4 HttpSessionAttributeListener监听器

image.png

5 ServletContextListener监听器

image.png

6 ServletContextAttributeListener监听器

image.png

7 HttpSessionBindingListener监听器

image.png

8 HttpSessionActivationListener监听器

image.png 钝化:把数据从内存取出来放入硬盘。

活化:把数据从硬盘取出来放入内存。