JavaWeb三大组件—Filter&&Listener
Filter概念
一般用于完成通用是操作。如登录验证,编码统一处理,敏感字符过滤
-
拦截修改请求:在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
-
拦截修改响应:在HttpServletResponse到达客户端之前,拦截HttpServletResponse。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
原理
通常Filter完整的工作流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
Filter的底层原理是基于函数回调的(责任链模式)
Filter快速入门
1.步骤:
1.定义一个类,实现接口Filter
2.复写
3.配置拦截路径
两种配置方法
1.web.xml 配置
<filter>
<filter-name>demo2</filter-name>
<filter-class>cn.itcast.web.filter.FilterDemo2</filter-class>
</filter>
<filter-mapping>
<filter-name>demo2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.注解
@WebFilter("/*") 里面是拦截规则
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class FilterDemo1 implements Filter {
/**初始化方法,只会在web应用程序启动时调用一次
和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。
web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
Filter对象创建之后会驻留在内存,一直服务。*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//完成实际的过滤操作。当客户请求访问与过滤器关联的URL的时候,Servlet过滤器将先执行doFilter方法。FilterChain参数用于访问后续过滤器。
System.out.println("filter");
// 放行,如果不放行,那么被访问的资源将无法看见
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
Filter执行流程
请求首先到达过滤器doFilter方法,然后对request请求增强 ,然后判断是否放行,如果放行调用filterChain方法等Servlet执行完毕后,对response增强。
Filter过滤器生命周期
1.init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
2.doFilter:每一次请求被拦截资源时,会执行。执行多次
3.destroy:在服务器关闭后,Filter对象会被销毁。如果服务器是正常关闭,则会执行destory方法。只执行一次。用于释放资源
Filter拦截配置
Filter拦截路径问题
1.具体资源路径拦截:/index.jsp 只有访问index.jsp资源时,过滤器才会被执行
2.拦截目录:/user/* 访问/user下的所有资源时,过滤器都会被执行
3.后缀名拦截:*.jsp 访问所有后缀名为jsp资源时 过滤器都会被执行
4.拦截所有资源:/* 访问所有资源时过滤器会被执行
Filter拦截方式配置
* 注解配置
1.REQUEST:默认值。浏览器直接请求资源
2.FORWARD:转发访问资源
3.INCLUDE:包含访问资源
4.ERROR:错误跳转资源
5.ASYNC:异步访问资源
* web.xml配置
设置<dispatcher></dispatcher>标签即可
Filter过滤器链
执行顺序:如果有两个过滤器:过滤器1,过滤器2
1.过滤器1
2.过滤器2
3.资源执行
4.过滤器2
5.过滤器1
注解配置:按照类名的字符串比较规则比较,值小的先执行
web.xml配置:谁定义在上边谁先执行
Listener:监听器
* 事件监听机制
* 事件 :一件事情
* 事件源 :事件发生的地方
* 监听器 :一个对象
* 注册监听 :将事件,事件源,监听器绑定在一起。当事件源上发生某个事件后,执行监听器代码
ServletContextListener
监听ServletContext对象的创建和销毁
包含两个方法
contextDestroyed(ServletContextEvent sce) : ServletContext对象被销毁之前会调用该方法
contextInitialized(ServletContextEvent sce) : ServletContext对象创建后会调用该方法
1.定义一个类,实现ServletContextListener接口
2.复写方法
3.配置
1.web.xml
2.注解 @WebListener
三大组件的启动顺序
listener>filter>Servlet