Filter(过滤器)
javaweb中的过滤器
当用户访问服务器资源时,过滤器将请求拦截下来,完成一些特殊的功能.还可以对响应信息进行拦截过来(一般是用来做数据压缩的)
作用:一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤
执行流程
1.客户端向服务器发起访问资源的请求
2.Filter将请求拦截住,开始处理访问资源之前的逻辑
3.Filter决定是否要放行访问请求,如果放行,请求继续向后运行
4.请求访问到相关资源,然后服务器给出响应
5.Filter将响应拦截住,开始处理访问资源之后的逻辑
6.服务器将响应返回给浏览器
生命周期
init:过滤器的初始化方法,服务器启动的时候执行一次。
doFilter:当请求满足拦截路径条件时执行,可执行多次。
destory:过滤器的销毁方法,服务器停止或者将项目从服务器中移除的时候执行一次。
配置
一个路径只能有一个servlet执行,但是一个路径可以有多个filter执行.且filter中不存在路径优先级问题
- xml中,根据filter-mapping标签在web.xml中顺序决定的(自上而下的顺序)
- 注解中,根据FiIter的类名的字典(自然)顺序决定
- 精确路径匹配 例如:/demo1 /1.html /a/b/demo23
- 模糊路径匹配 例如:/a/b/* /a/* /* 注意:(/*在servlet中最好不要使用)
- 后缀名匹配 例如: *.jsp *.do *.action
在filter中一般使用的模糊路径匹配和后缀名匹配
默认情况下,过滤器只会拦截直接访问和重定向访问,其它的类型都不拦截,但是可以通过配置
dispatcher属性来改变这一行为。
REQUEST:默认值,用于拦截直接访问或者重定向请求
FORWARD:用于拦截转发请求
注解配置
使用注解可以简化xml的配置, 常用注解选项如下:
urlPatterns指定拦截的路径,等同于
initParams 配置参数
dispatcherTypes 配置拦截类型
<filter>
<filter-name>TargetFilter</filter-name><!--别名-->
<filter-class>com.eponine.Filter.TargetFilter</filter-class><!--全路径-->
</filter>
<filter-mapping><!--映射配置-->
<filter-name>TargetFilter</filter-name>
<url-pattern>/target.jsp</url-pattern><!--拦截路径-->
<!--
FORWARD拦截请求转发
REQUEST拦截直接访问,默认
如果设置成FORWARD,则只能拦截请求转发,直接访问无法拦截!一般不用!
-->
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
listener(监听器)
web中的监听器主要用于监听web三大域对象:Request、Session、ServletContext.
主要监听这三个域对象的创建和销毁以及域对象中存储对象的增加和减少.
public class MyListener implements ServletContextListener , HttpSessionAttributeListener{
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("context初始化");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("context摧毁");
}
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session添加");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session删除");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("session修改");
}
}