## 过滤器(重点) ##
**过滤器的概述**
1.过滤器是双向的
2.拦截一堆目标资源。(由配置文件决定)
**过滤器的简单入门**
1.编写一个类,实现filter接口,重写3个方法
2.在web.xml中进行配置。
<!-- 配置过滤器的信息 -->
<filter>
<!-- 配置名字 -->
<filter-name>FilterDemo1</filter-name>
<!-- 包名+类名 -->
<filter-class>cn.itcast.filter.FilterDemo1</filter-class>
</filter>
<!-- 配置过滤器的映射 -->
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<!-- 配置访问方式 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
**FilterChain对象**
1.doFilter(ServletRequest request, ServletResponse response) 执行下一个过滤器,如果没有下一个过滤器,访问目标资源。
**过滤器的生命周期**
1.Servlet生命周期:Servlet什么时候创建?默认不是由服务器启动时创建的,第一次访问的创建。调用init方法进行初始化操作。
Servlet什么是销毁?服务器关闭的时候或者移除项目时候。默认调用destroy()方法。
2.过滤器的生命周期:
* void init(FilterConfig filterConfig) -- 过滤器什么时候创建的?
* void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) -- 放行
* void destroy() -- 过滤器什么时候销毁
3.总结:服务器启动的时候创建过滤器实例(单例的),默认调用init方法进行初始化操作,doFilter方法就会执行。有一次执行一次。过滤器是关闭服务器或者移除项目销毁,销毁之前调用destroy方法进行销毁。
**FilterConfig接口**
1.ServletConfig
* 获取servlet-name的名称
* 获取初始化参数
* 获取ServletContext对象
2.FilterConfig对象的方法
* String getFilterName() -- 获取<filter-name>的名称
* String getInitParameter(String name) -- 获取初始化参数的值(重点)
* Enumeration getInitParameterNames() -- 获取初始化参数(重点)
* ServletContext getServletContext() -- 获取ServletContext域对象(重点)
**过滤器的配置**
1.配置<filter>
* <filter-name> -- 配置filter的名称
* <filter-class> -- 包名+类名
* <init-param> -- 配置初始化参数
2.配置<filter-mapping>
* <filter-name> -- 配置filter的名称和<filter>标签中的<filter-name>配置必须是相同的。
* <url-pattern> -- 配置过滤的路径
* 完全路径匹配 以/开头的 /aa /aa/bb localhost/day21/aa/bb
* 目录匹配 以/开头的 /* /aa/* localhost/day21/aa/bb
* 扩展名匹配 不能以/开头 *.jsp 访问所有的jsp都会被拦截
* 优先级:完全路径 > 目录匹配 > 扩展名匹配
* 在web.xml中配置2个(A,B)过滤器,每个过滤器的配置都是/* AB过滤器执行顺序是什么样的?
* 和在web.xml中的配置(<filter-mapping>)顺序有关。
* <servlet-name> -- 过滤器过滤指定的servlet 直接配置Servlet的名称
* <dispatcher>
* REQUEST -- 默认只拦截请求。REQUEST也是默认值。
* FORWARD -- 只拦截转发的
* INCLUDE -- 包含
* ERROR -- 需要在web.xml进行配置
**过滤器的案例**
**设置全局的编码**
1.每次在编写表单和向页面做出响应的时候,都需要设置request和response的一些信息。
2.那咱们就可以使用过滤器来解决类似的问题。
**禁用浏览器的缓存**
1.记住CEP三个头。日期类型。
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
// 第三个头是日期类型
response.setDateHeader("Expires", -1);
**分ip统计访问的次数**
1.怎么获取ip地址:request.getRemoteAddr()
* 1.获取map
* 2.获取ip
* 3.在map中和ip做对比
* * 如果map中有ip,获取count,+1
* * 如果map中没有ip,把ip和count=1存入到map中
* 4.把map存入到ServletContext中
* 5.放行
**自动登陆的功能**
1.依赖登陆的功能。已搞定。
2.分析需求:必须先登陆,并且选择自动登陆的按钮。下一次再直接访问suc.jsp的时候,直接进去了,不用再登陆了。
3.分析哪些技术?
* 需要先使用cookie,cookie可以记住用户名和密码。下一次请求,默认携带cookie过来了。
* 还需要session,第一次登陆的时候,把用户名和密码保存到session中。通过session来判断是否登陆成功。
* 过滤器,拦截的目的:获取cookie,获取用户名和密码,和数据库查询,匹配了,把用户的信息放入session中。
4.cookie技术,保存数据,回写到浏览器。设置有效时间。
* 把用户名和密码保存起来。回写到客户端上。
5.分析的过程
* 在过滤器中可以直接获取session中的用户信息,如果user不为空,说明浏览器没关。放行。
* 从session中获取不到user的信息
* 先获取cookie,获取指定名称的cookie,
* 如果cookie为空,放行。
* 如果cookie不为空,获取用户名和密码。去数据库查询。
* 如果查询不到,cookie的信息不正确,放行(没有存入session中)。
* 如果查询到了,cookie中的信息是正确,把用户的信息保存到session中。放行。
**URL级别(粗粒度)的权限验证**
1.需求:依赖用户登陆的功能。如果你的用户的type类型是admin,只能让用户访问/admin/xxx.jsp文件。如果用户的type是usesr的话,只能访问/user/xxx.jsp的文件。
2.分析: