Filter
概念
过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener。
它是在2000年发布的Servlet2.3规范中加入的一个接口。是Servlet规范中非常实用的技术。
它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作。
常见应用场景:URL级别的权限控制;过滤敏感词汇;中文乱码问题等等。
可以说是对一个servlet的增强
步骤:
1.定义一个类,实现接口Filter(实现的是servlet包下的filter)
2.复写方法(dofilter方法)
3.配置拦截路径(两种方式 1.web.xml配置 2.注解配置)
//注解配置
@WebFilter("/*")
//实现的是servlet包下的filter(别导错包)
public class EncodingFilter implements Filter {
}
xml配置方式:
<!--配置过滤器-->
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>com.itheima.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
//放行
filterChain.doFilter(servletRequest,servletResponse);
过滤器初始化参数配置
<filter>
<filter-name>FilterDemo2</filter-name>
<filter-class>com.itheima.web.filter.FilterDemo2</filter-class>
<!--配置过滤器的初始化参数-->
<init-param>
<param-name>filterInitParamName</param-name>
<param-value>filterInitParamValue</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterDemo2</filter-name>
<url-pattern>/ServletDemo1</url-pattern>
</filter-mapping>
生命周期
出生:当应用加载的时候执行实例化和初始化方法。
活着:只要应用一直提供服务,对象就一直存在。
死亡:当应用卸载时,或者服务器宕机时,对象消亡。
过滤器的五种拦截行为
<!--配置过滤器-->
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>com.itheima.web.filter.FilterDemo1</filter-class>
<!--配置开启异步支持,当dispatcher配置ASYNC时,需要配置此行-->
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/ServletDemo1</url-pattern>
<!--过滤请求:默认值。-->
<dispatcher>REQUEST</dispatcher>
<!--过滤全局错误页面:当由服务器调用全局错误页面时,过滤器工作-->
<dispatcher>ERROR</dispatcher>
<!--过滤请求转发:当请求转发时,过滤器工作。-->
<dispatcher>FORWARD</dispatcher>
<!--过滤请求包含:当请求包含时,过滤器工作。它只能过滤动态包含,jsp的include指令是静态包含-->
<dispatcher>INCLUDE</dispatcher>
<!--过滤异步类型,它要求我们在filter标签中配置开启异步支持-->
<dispatcher>ASYNC</dispatcher>
</filter-mapping>
过滤器细节
过滤器执行流程
1.执行过滤器
2.执行放行后的资源
3.回来执行过滤器放行代码下边的代码
过滤器配置详解
拦截路径配置:
1.具体资源路径: /index.jsp 只有访问index.jsp资源时,过滤器才会被执行
2.拦截目录: /user/* 访问/user下的所有资源时,过滤器都会被执行
3.后缀名拦截: *.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行
4. 拦截所有资源:/* 访问所有资源时,过滤器都会被执行
拦截方式配置:资源被访问的方式 注解配置:
设置dispatcherTypes属性
1.REQUEST:默认值。浏览器直接请求资源
2.FORWARD:转发访问资源
3.INCLUDE:包含访问资源
4.ERROR:错误跳转资源
5.ASYNC:异步访问资源
*web.xml配置
* 设置<dispatcher></dispatcher>标签即可
过滤器链(配置多个过滤器)
* 执行顺序:如果有两个过滤器:过滤器1和过滤器2
1.过滤器1
2.过滤器2
3.资源执行
4.过滤器2
过滤器1 * 过滤器先后顺序问题:
1.注解配置:按照类名的字符串比较规则比较,值小的先执行
* 如: AFilter 和 BFilter,AFilter就先执行了。
2.web.xml配置: <filter-mapping>谁定义在上边,谁先执行
3.又有注解配置又有xml文件配置,先执行xml文件配置的
Listener:监听器
概念:
web的三大组件之一。
事件监听机制:
* 事件:一件事情
* 事件源 :事件发生的地方
* 监听器 :一个对象
*注册监听:
将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码
Servlet规范中的8个监听器简介
监听对象创建的
-
ServletContextListener
用于监听ServletContext对象创建和销毁的监听器
-
HttpSessionListener
用于监听HttpSession对象创建和销毁的监听器
-
ServletRequestListener
用于监听ServletRequest对象创建和销毁的监听器
监听域中属性发生变化的
-
ServletContextAttributeListener
用于监听ServletContext域(应用域)中属性发生变化的监听器
-
HttpSessionAttributeListener
用于监听HttpSession域(会话域)中属性发生变化的监听器
-
ServletRequestAttributeListener
用于监听ServletRequest域(请求域)中属性发生变化的监听器
和会话相关的两个感知型监听器
和会话域相关的两个感知型监听器是无需配置的,直接编写代码即可。
-
HttpSessionBinderListener
用于感知对象和和会话域绑定的监听器 当有数据加入会话域或从会话域中移除,此监听器的两个方法会执行。 加入会话域即和会话域绑定 从会话域移除即从会话域解绑
-
HttpSessionActivationListener
用于感知会话域中对象钝化和活化的监听器
监听器的使用
- 第一步:创建工程
- 第二步:编写监听器
- 第三步:在web.xml中配置监听器
<!--配置监听器-->
<listener>
<listener-class>com.entor.listener.Servlet</listener-class>
</listener>