Filter过滤器
-
什么是Filter过滤器
- Filter过滤器是Java web三大组件之一
- Filter过滤器的作用是:拦截请求,过滤响应
常用场景
- 权限检查
- 日记操作
- 事务管理
- 等等
-
如何使用Filter过滤器
- 创建一个类实现Filter接口
- 实现doFilter方法
- 在web.xml文件中配置信息
我们通过模拟用户登录,才能查看admin文件下的所有信息
//创建一个类实现Filter接口 public class AdminFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //实现doFilter方法 HttpServletRequest req = (HttpServletRequest) servletRequest; Object username = req.getSession().getAttribute("username"); if("admin".equals(username)){ //admin用户登录,允许访问页面 filterChain.doFilter(servletRequest,servletResponse); }else { //没有权限访问页面,跳转到登录页面 req.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse); } } @Override public void destroy() { } }
配置web.xml文件
<filter> <filter-name>AdminFilter</filter-name> <filter-class>com.yellowstar.filter.AdminFilter</filter-class> </filter> <filter-mapping> <filter-name>AdminFilter</filter-name> <!-- /:映射到web目录 --> <url-pattern>/admin/*</url-pattern> </filter-mapping>
-
Filter过滤器的生命周期
-
构造方法
-
init()
构造方法和init()在web工程启动时创建
-
doFilter()
doFilter()在每次访问请求时,经过过滤器触发
-
destroy()
destroy()在web工程停止时销毁
-
-
FilterConfig类
这个类用来读取Filter配置信息
配置web.xml文件
<filter> <filter-name>AdminFilter</filter-name> <filter-class>com.yellowstar.filter.AdminFilter</filter-class> <init-param> <param-name>username</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123456</param-value> </init-param> </filter> <filter-mapping> <filter-name>AdminFilter</filter-name> <!-- /:映射到web目录 --> <url-pattern>/admin/*</url-pattern> </filter-mapping>
使用Filter读取配置文件信息
@Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("2.初始化方法"); //获取Filter的别名 System.out.println("FilterName的值为:" + filterConfig.getFilterName()); //获取在 web.xml 中配置的 init-param 初始化参数 System.out.println("username的值为:" + filterConfig.getInitParameter("username")); System.out.println("password的值为:" + filterConfig.getInitParameter("password")); //获取ServletContext对象 System.out.println(filterConfig.getServletContext()); }
-
FilterChain过滤器链
我们来看一下当有多个过滤器时,filter过滤器是如何工作的
chain.doFilter()的作用
- 执行下一个过滤器(如果有filter)
- 执行目标资源(如果没有filter)
- 特点
- 在多个过滤器执行时,他们的优先顺序取决于web.xml文件中配置filter的从上到下的顺序
- 所有filter在执行时,默认都是处于同一条线程中
- 所有filter执行时,共享request域中的数据
-
Filter的拦截路径
-
精准匹配
<url-pattern>/a.jsp</url-pattern>
以上配置路径,路径必须为http://ip:port/工程路径/a.jsp
-
目录匹配
<url-pattern>/admin/*</url-pattern>
以上配置路径,文件路径必须为http://ip:port/工程路径/admin/ 包下
-
后缀匹配
<url-pattern>*.html</url-pattern>
以上配置路径,文件路径必须已.html结尾
Filter过滤器只关心路径是否匹配,不关系路径是否真实存在
-