学 Java 开发怎么能不知道 Filter 与 Listener

时间:2022-07-26
本文章向大家介绍学 Java 开发怎么能不知道 Filter 与 Listener,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1.1 过滤器

1.1.1 简介

  Filter 也称之为过滤器,它是 Servlet 技术中最实用的技术之一。通过 Filter 技术,可以对 web 服务器管理的所有 web 资源:例如 JSP, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的通用功能。例如实现 URL 级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。   Filter 主要用于对用户请求进行预处理,也可以对 HttpServletResponse 响应进行后处理。Filter 的执行流程:Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再对服务器响应进行后处理。

1.1.2 Filter 的使用

① 定义一个类,实现接口 Filter 并复写方法

public class FilterDemo implements Filter {
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
	
	}
	
	
	/**
	* 主要功能都在 doFilter 方法内实现
	*/
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) 
																			throws IOException, ServletException {
		System.out.println("我被拦截器拦截了....");
		//放行
		filterChain.doFilter(request, response);
	
	}
	
	@Override
	public void destroy() {
	
	}
}

② 配置拦截路径

<!-- 使用 web.xml 配置 -->
<filter>
	<filter-name>demo</filter-name>
	<filter-class>com.software.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
	<filter-name>demo</filter-name>
	<!-- 拦截路径 -->
	<url-pattern>/*</url-pattern>
</filter-mapping>
// 使用注解配置
@WebFilter("/*")

1.1.3 拦截器生命周期

 ① init:在服务器启动后,会创建 Filter 对象,然后调用 init 方法。只执行一次。一般用于加载资源  ② doFilter:每一次请求被拦截资源时,会执行。执行多次  ③ destroy:在服务器关闭时,Filter 对象被销毁。如果服务器是正常关闭,则会执行 destroy 方法。只执行一次。一般用于释放资源

1.1.4 过滤器拦截路径

 ① 具体资源路径:/index.jsp /findUser 只有访问 index.jsp 、findUser 时,过滤器才会被执行  ② 拦截目录:/user/* 访问 user 目录下的所有资源时,过滤器都会被执行  ③ 后缀名拦截:*.jsp 访问所有后缀名为 jsp 资源时,过滤器都会被执行  ④ 拦截所有资源:/* 访问所有资源时,过滤器都会被执行

1.1.5 过滤器拦截方式

注解配置(设置 dispatcherTypes 属性)

// 浏览器直接请求 index.jsp 资源时,该过滤器会被执行
@WebFilter(value="/index.jsp", dispatcherTypes = DispatcherType.REQUEST)

// 只有转发访问 index.jsp 时,该过滤器才会被执行
@WebFilter(value="/index.jsp", dispatcherTypes = DispatcherType.FORWARD)

// 浏览器直接请求 index.jsp 或者转发访问 index.jsp。该过滤器都会被执行
@WebFilter(value="/*", dispatcherTypes = { DispatcherType.FORWARD, DispatcherType.REQUEST})

/*
 *	① REQUEST:默认值。浏览器直接请求资源
 *	② FORWARD:转发访问资源
 *	③ INCLUDE:包含访问资源
 *	④ ERROR:错误跳转资源
 *	⑤ ASYNC:异步访问资源
 */

web.xml 配置

<filter-mapping>
	<filter-name>demo</filter-name>
	<url-pattern>/*</url-pattern>
	<!-- 可配置多个dispatcher标签 -->
	<dispatcher>REQUEST</dispatcher>
	<dispatcher>FORWARD</dispatcher>
</filter-mapping>

1.1.6 过滤器链

  FilterChain 称为过滤器链,web 应用中可以存在很多个 Filter 过滤器,多个 Filter 过滤器组合起来就是一个过滤器链,受同一个 FilterChain 管理。

执行流程图

执行先后顺序  注解配置:按照类名的字符串比较规则比较,值小的先执行。  web.xml 配置:谁定义在上边,谁先执行。

1.2 监听器

1.2.1 简介

  web 监听器是一种 Servlet 中的特殊的类,它们能帮助开发者监听 web 中的特定事件,比如ServletContext、HttpSession、ServletRequest 的创建和销毁;或者监听变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控。框架底层已经帮助我们实现了,此处只做简要介绍。

1.2.2 监听器的使用

① 定义一个类,实现 ServletContextListener 接口,并复写方法

public class MyListener implements ServletContextListener {

    /**
     * ServletContext 对象被销毁之前会调用该方法
     **/
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {

    }

    /**
     * ServletContext 对象创建后会调用该方法
     **/
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}

② 配置

<!--  web.xml 配置 -->
<listener>
   <listener-class>com.software.listener.MyListener</listener-class>
</listener>
// 注解配置
@WebListener