文章目录
一 Servlet
二 Filter
2.1 概念
用户访问服务器资源时,Filter过滤器可以将请求拦截下来,完成一些特殊的功能,比如说登录验证、统一编码处理、敏感字符过滤……
2.2 快速上手
-
定义一个类,实现接口Filter。不需要导入jar包,引入资源
import javax.servlet.*;
。 -
复写方法:
init()
、doFilter()
、destroy()
。在doFilter()
编写过滤代码后一定要调用chain.doFilter(req, resp);
继续处理请求。 -
配置拦截路径,用
web.xml
文件配置或者注解@WebFilter(...)
。
2.3 更多使用
2.3.1 Filter过滤器执行流程
2.3.2 Filter过滤器的生命周期方法
init()
:在服务器启动后,会创建Filter
对象,然后调用init
方法。只执行一次。用于加载资源。doFilter()
:每一次请求被拦截资源时,会执行。执行多次。destroy()
:在服务器关闭后,Filter
对象被销毁。如果服务器是正常关闭,则会执行destroy
方法。只执行一次。用于释放资源。
2.3.3 Filter过滤器配置详解
拦截路径,有四种: | 说明 |
---|---|
具体资源路径,如:/index.jsp | 只有访问 index.jsp 资源时过滤器才会执行。 |
拦截目录,如:/user/* | 访问 /user 下的所有资源时,过滤器都会被执行。 |
后缀名拦截,如:*.jsp | 访问所有后缀名为 .jsp 资源时,过滤器都会被执行。 |
拦截所有资源:/* | 访问所有资源时,过滤器都会被执行。 |
还可以通过资源请求方法拦截,如写在注解中的拦截方法:@WebFilter(value = "/*", dispatcherTypes = DispatcherType.FORWARD)
。
- DispatcherType.REQUEST,默认值,浏览器直接请求资源。
- DispatcherType.FORWARD,转发访问资源。
- DispatcherType.INCLUDE,包含访问资源。
- DispatcherType.ERROR,错误跳转资源。
- DispatcherType.ASYNC,异步访问资源。
2.3.4 多个Filter过滤器执行拦截的先后顺序
假如现在有两个Filter过滤器:Filter1.java
和 Filter2.java
,都使用的注解配置 @WebFilter("/*")
,此时Filter过滤器的执行顺序按照类名的字符串比较规则比较,值小的先执行:先执行 Filter1.java
,再执行 Filter2.java
,然后去访问资源 Servlet / .jsp ,拿到资源后原路返回,依次执行 Filter2.java
、 Filter1.java
。
如果是使用的 web.xml
文件配置过滤器,那么要看 <filter-mapping>
标签中哪个过滤器在前,哪个在后,在前的先执行。
三 Listener
3.1 概念
是一个事件监听机制。
事件:一件事情。
事件源:事件发生的地方。
监听器:一个对象。
注册监听:将事件、事件源、监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码。
3.2 ServletContextListener
有好几种Listener,其中最常用的是 ServletContextListener
,用来监听 ServletContext
对象的创建和销毁。
ServletContextListener中的方法 | 说明 |
---|---|
void contextInitialized(ServletContextEvent sce) | ServletContext对象创建后会调用该方法(该方法一般用来加载资源文件applicationContext.xml) |
void contextDestroyed(ServletContextEvent sce) | ServletContext对象被销毁之前会调用该方法 |
快速上手使用 ServletContextListener
:
-
定义一个类,实现接口
ServletContextListener
-
复写方法
-
配置。通过注解配置:
@WebListener