Filter和Listener的简单学习

175 阅读3分钟

一、Filter过滤器

1、概念

生活中有哪些过滤器呢?————净水器、空气净化器

web中的过滤器:当访问服务器的资源时,过滤器可以请求拦截下来,完成一些特殊功能。

常用的场景:登录验证、统一编码处理、敏感字符过滤等等。

2、步骤

我们先来简要写一下,首先定义一个类实现接口Filter,其次重写方法,最后配置拦截路径

@WebFilter("/*")  //访问所有资源之前,都会执行该过滤器
public class FilterTest implements Filter {
    @Override
    public void init(FilterConfig filterconfig) throws ServletException {
        System.out.println("初始化Filter");
    }
    @Override
    public void doFilter(ServletRequest req,ServletResponse res,FilterChain fc) throws IOException ,
    ServletException {
        System.out.println("执行ing...");
        
        //放行
        fc.doFilter(rep,res);
        System.out.println("返回执行doFilter方法");
    }
    @Override
    public void destroy() {
        System.out.println("go die~");
    }
}

3、很重要的细节问题

①web.xml配置

<filter>
<!-- 过滤器内部名称 -->
	  <filter-name>FilterTest</filter-name>
<!-- 过滤器类的全名 -->	  
	   <filter-class>wzm.web.filter.FilterTest</filter-class>
</filter>
<filter-mapping>
<!-- 过滤器内部名称 -->
	        <filter-name>FilterTest</filter-name>
			<!-- 拦截路径 -->
	        <url-pattern>/*</url-pattern>
	    </filter-mapping>

②过滤器执行流程

a.执行过滤器

b.执行放行后的资源

c.回来执行过滤器放行代码下的代码

③过滤器的生命周期

a.init:在服务器启动后,创建Filter对象,调用init方法,只执行一次,用于加载资源

b.doFilter:每一次请求被拦截资源时,执行。执行多次。

c.destroy:在服务器关闭后,销毁Filter对象,若服务器正常关闭,执行destroy方法,执行一次,释放资源。

④过滤器配置详情

a.拦截路径配置:

(一)具体资源路径:/index.jsp ,只有访问index.jsp资源时,过滤器才会执行。

(二)拦截目录:/user/* ,访问/user下的所有资源时,过滤器才会执行。

(三)后缀名拦截:*.jsp,访问后缀名有jsp的资源时,过滤器才会执行。

(四)拦截所有资源:/* ,访问所有资源时,过滤器都会执行。

b.拦截方式配置

(一)注解配置

设置dispatcherTypes属性

REQUEST:默认值,浏览器直接请求资源

FORWARD:转发访问资源

INCLUDE:包含访问资源

ERROR:错误跳转资源

ASYNC:异步访问资源

(二)web.xml配置

设置dispatcher 、 /dispatcher标签即可

⑤过滤器执行的先后顺序问题

(一)注解配置:按照类名的字符串比较规则比较,值小的先执行 * 如: AFilter 和 BFilter,AFilter就先执行了。

(二) web.xml配置: filter-mapping 谁定义在上边,谁先执行

4、来个案例

解决全站乱码问题,处理所有的请求

import...
public class CharacterFilter implements Filter{
    
    public void init (FilterConfig filterconfig) throws ServletException {
        
    }
    
    public void doFilter(ServletRequest req,ServletResponse res,FilterChain fc) throws IOException
    ,ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    
    String method = request.getMethod();
    
    //解决post请求中文数据乱码问题
    if(method.equalsIgnoreCase("post")) {
        request.setCharacterEncoding("utf-8");
    }
    
    //处理响应乱码
    response.setContentType("text/html;charset=utf-8");
    fc.doFilter(request,response);
    }
    
    public void destroy() {
        
    }
}

二、Listener监听器

1、概念

web的三大组件之一

事件监听机制 ——

事件:一件事情

事件源:事件发生的地方

监听器:一个对象

注册监听:将以上三者绑定在一起,当事件源上发生某个事件后,执行监听器代码。

2、方法

ServletContextListener:监听ServletContext对象的创建和销毁

①void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法

②void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法

3、步骤

①定义类,实现ServletContextListener接口

②重新方法

③配置
(一) web.xml
	<listener>
  <listener-class>wzm.web.listener.ContextLoaderListener</listener-class>
	</listener>