Java Web随笔--过滤器Filter和监听器Listener

过滤器

Filter:过滤器,是Java Web技术中的三大组件之一(还有Servlet和Listener)。其对应的接口为javax.servlet.Filter

Filter命名为过滤器,顾名思义,就跟我们生活中的自来水一样,可能会自来水的源头可能会来源于不同的地方,但是我们要使用的话都是要经过自家的过滤器进行一些处理,比如吸附杂质啦,去除异味啦。而在程序中体现过滤器的处理的就是对“来源”进行一些统一的处理,才能最终被"接收"。
类比我们用水龙头接收自来水,服务器端就相当于接收的地方,而"水"的来源则来源于浏览器端,这些来源即是浏览器向服务器中发送的各种请求。如果我们使用了过滤器来拦截这些请求,那么就可以对这些请求做一些统一的操作,以简化Servlet类的书写。

即:

web中的过滤器指的是当浏览器访问服务器资源时(发送请求),过滤器可以将请求拦截下来,进行一些统一处理,完成一些特殊功能,之后再放行。

主要用途

  • 设置统一编码,之前在学Servlet的时候,经常要在每个Servlet类中设置请求消息字符集和响应消息字符集,有了过滤器之后就可以统一设置了

  • 进行一些逻辑判断,例如判断用户登录,是否有权限访问该页面,过滤敏感字符(游戏中常见的名称被*标)等

基本使用

  1. 创建一个类继承Filter(javax.servlet.Filter),实现其对应的方法,包括:init(), doFilter(),destory().

  2. 配置拦截路径,两种方式:

  • 在web.xml中配置,其示例如下:
<!--filter web.xml配置-->
    <filter>
        <filter-name>demo1</filter-name>
        <!-- 对应的实现Filter接口的类-->
        <filter-class>smrobot.zhang.Filter.FilterDemo1</filter-class>
    </filter>
    <filter-mapping>
    	<!--映射 名称要和上面的filter-name标签中的名称对应-->
        <filter-name>demo1</filter-name>
        <!--设置拦截路径,即是注解中的内容-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  • 使用注解方式配置:
    直接在创建的Filter类中加上注解:
@WebFilter("/*") 		// /*表示所有访问都拦截
public class FilterDemo1 implements Filter {
    
    
}
  1. 书写doFilter()方法,实现相应功能:

    使用IDEA直接创建出来的Filter实现类代码如下:

package smrobot.zhang.Filter;

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

@WebFilter(value = "/*", dispatcherTypes = DispatcherType.REQUEST)
public class FilterDemo1 implements Filter {
    
    
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    
    

        System.out.println("FilterDemo1被执行");
        //放行
        chain.doFilter(req, resp);
        System.out.println("FilterDemo1回来了");

    }

    public void init(FilterConfig config) throws ServletException {
    
    

    }

    public void destroy() {
    
    
    }


}

说明:

  • init():方法是初始化过滤器对象,在服务器启动的时候就会被创建了

  • destory():方法是销毁过滤器对象,当服务器正常关闭时(就Tomcat而言使用自带的关闭程序或者在IDEA中点击关闭按钮都是正常关闭)被调用。

  • 这两个方法用得不多,主要的还是doFilter()方法:当浏览器访问服务器资源的时,并且该资源访问路径在该过滤器配置的拦截路径中,就会调用该方法,程序执行该doFilter()方法的流程为:

    请求访问资源时调用chain.doFilter(req, resp)之前的代码(如上代码),只有写上该代码过滤器才会放行让请求通过,不然请求时无法通过该过滤器,以至于请求不到资源。请求完毕之后程序将返回该方法,并执行chain.doFilter(req, resp)之后的代码。

过滤器的配置细节:
一:拦截路径的配置:

  • 写上具体拦截路径:/index.jsp 只有访问该资源该过滤器才会被执行(对应的Filter实现类)

  • 拦截目录: /user/* 访问/user资源目录下的所有资源该过滤器会被执行

  • 后缀名拦截: *.jsp 拦截所有后缀名为.jsp的资源,注意没有反斜杆 “/”

  • 拦截所有资源: /* 拦截所有资源

二: 拦截方式配置:所谓方式,指的是资源被访问的方式,比如我们常见的转发请求,直接访问等。因此过滤器对各种访问方式就会有对应的拦截方式,包括以下几种方式:

  • 注解配置:
    • 设置dispatcherTypes属性
      1. REQUEST:默认值。浏览器直接请求资源
      2. FORWARD:请求转发访问资源
      3. INCLUDE:包含访问资源
      4. ERROR:错误跳转资源,即跳转到错误页面时
      5. ASYNC:异步访问资源
    • 示例:
@WebFilter(value = "/*", dispatcherTypes = DispatcherType.REQUEST)
public class FilterDemo1 implements Filter {
    
    
    			···
}
  • web.xml配置
    • 设置****标签即可
<!--filter web.xml配置-->
    <filter>
        <filter-name>demo1</filter-name>
        <filter-class>smrobot.zhang.Filter.FilterDemo1</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>demo1</filter-name>
        <!--设置拦截路径,即是注解中的内容-->
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

过滤器链:即可以对一个资源路径设置多个过滤器,在请求资源时会逐个通过多个过滤器,多个过滤器即构成过滤器链。

而资源在通过这些过滤器时是有一个先后顺序的,访问的先后顺序是根据我们配置过滤器的拦截路径不同而不同的。

  • 注解配置:根据Filter实现类的类名的字符串比较来运行的,小的先执行,大的后执行。
  • web.xml配置:哪个定义在上边,谁就先执行。

监听器

Listener: 监听器,也是web的三大组件之一,不过用的好像相对较少,基本不会使用到

监听器相关:

事件监听机制

  • 事件 :一个操作,事件,例如鼠标滑动,键盘点击,当然在java中不是指这些
  • 事件源 :事件发生的地方,比如对应组件
  • 监听器 :一个对象,在java中即实现对应的类,跟Servlet和Filter类似,实现监听代码
  • 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码

主要监听器:

ServletContextListener:

监听ServletContext对象创建与销毁,因此在服务器启动和关闭之前就会调用。

使用方式:

  • 创建类继承ServletContextListener接口

  • 复写对应的方法:

    @WebListener
    public class ListenerDemo1 implements ServletContextListener {
           
           
        @Override
        public void contextInitialized(ServletContextEvent servletContextEvent) {
           
           
    		//ServletContext对象创建时调用
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent servletContextEvent) {
           
           
    		//ServletContext对象销毁时调用
        }
    }
    

配置方式:

  • 注解配置:

    直接加上 @WebListener 即可

  • web.xml配置:

    Listener类名

    ​ transformWsdlLocations
    ​ false

其他监听器:

HttpSessionListener:监听Session的创建于销毁

HttpSessionAttributeListener: 监听Session的属性的添加,删除和替换

猜你喜欢

转载自blog.csdn.net/weixin_44184990/article/details/107500747