过滤器Filter
- 1. 简介
- 2. 快速入门
- 3. 执行流程
- 4. 使用细节
- 4.1 拦截路径
- 4.2 过滤器链
- 5. 案例
- 5.1 需求
- 5.2 LoginFilter
1. 简介
过滤器是JavaWeb三大组件之一(Servlet、Filter,Listner);
作用:
把对资源(servlet、jsp、html等)的请求拦截下来,从而实现一些特殊的功能;
如权限控制、统一编码处理、敏感字符处理等;
如:在每一个资源中判断用户是否登录!如果没有登录则不能访问资源!—在Filter中去判断是否登录!
2. 快速入门
Filter和Servlet是JavaWeb的三大组件之一,使用方法和Servlet类似;
-
定义类:实现Filter接口(javax.servlet),并重写所有方法;
doFilter()
即核心方法,将来每次访问Filter都会执行; -
配置:在类上定义
@WebFilter
,然后配置Filter拦截的资源路径,注解:
/*
即拦截所有资源;
-
在doFilter方法中输出
chain.doFilter()
,并放行,让请求向后访问。
3. 执行流程
-
【放行前】,对request数据进行处理,respond为空,将新的request传入doFilter();
-
【放行后】,请求访问完资源,r此时respond不为空,要对respond处理!
注意:
请求被放行后,访问完资源,而后还会倒回来经过Filter!此时会执行Filter中chain.doFilter() 后面的代码!
4. 使用细节
4.1 拦截路径
4.2 过滤器链
一个Web应用,可以配置多个过滤器,这多个过滤器被称为过滤器链;
当配置了多个Filter时,执行的优先级按照过滤器类名(字符串)自然排序;
注意执行顺序! 过滤器1放行后执行过滤器2;
访问完资源后,先回到过滤器2再执行过滤器1;
5. 案例
5.1 需求
- 访问服务器资源时,需要先进行登录验证,如果没有登录则被Filter 拦截,跳转到登录页面;
如果登录过了,则放行; - 登陆相关的静态页面(css、html)要能够被访问,而**不被拦截! **
5.2 LoginFilter
如果请求是静态页面的url,则后序判断(是否用户登录)则不需要执行!
- 要让和登陆相关的静态资源放行,先用String [] 数组记录下这些静态资源;
- 用
getRequestURL()
获取当前访问的资源路径; - 判断当前访问的资源中 是否包含之前记录的要放行的等静态资源,如果包含则直接放行并return,不再判断是否登录;
判断是否是静态资源,是则放行再return !
LoginFilter 所在位置:
LoginFilter :
判断是否登录:
效果:此时登陆页面的静态资源可以访问;
如果没有放行静态资源,会跳转到login.jsp并提示,但是缺少html、css等静态资源: