一、过滤器
1、过滤器简介
过滤器是一个服务器端的组件,它可以截取用户端的请求与响应信息,并对这些信息过滤。
2、过滤器的工作原理和生命周期
3、第一个过滤器案例
1)创建过滤器类,实现javax.servlet.Filter接口
2)重写Filter方法
init()方法
这是过滤器的初始化方法,Web容器创建过滤器实例后将调用这个方法。这个方法中可以读取web.xml文件中过滤器的参数。
(比如用FilterConfig接口用来,为了获取Filter程序在web.xml文件中的配置信息)
doFilter()方法
这个方法完成实际的过滤操作。这个地方是过滤器的核心方法。当用户请求访问与过滤器关联的URL时,Web容器将先调用过滤器的doFilter方法。FilterChain参数可以调用chain.doFilter方法,将请求传给下一个过滤器(或目标资源),或利用转发、重定向将请求转发到其他资源。(单个Filter或者Filter链执行每次多次调用执行的方法)
destroy()方法
Web容器在销毁过滤器实例前调用该方法,在这个方法中可以释放过滤器占用的资源。(大多数情况用不到)
4、过滤器分类
Servlet2.5
- PEQUEST:用户直接访问页面时,Web容器将会调用过滤器;
- FORWARD:目标资源是通过RequestDispatcher的forward访问时,该过滤器将被调用;
- INCLUDE:目标资源是通过RequestDispatcher的include方法调用时,过滤器将被调用;
- ERROR:目标资源是通过声明式异常处理机制调用时,过滤器将被调用;
- */过滤全部页面
Servlet3.0
ASYNC:支持异步处理;
5:过滤器应用
案例1:过滤器错误页面跳转
案例2:登录时编码过滤,统一编码问题
{
1:装饰设计模式
2:HttpServletRequestWrapper和HttpServletResponseWrapper作为request和response对象的包装类
}
装饰设计模式的特点
- 包装类要和别包装对象实现同样的接口
- 包装类持有一个被包装类对象。例如在HttpServletRequestWrapper定义的构造方法中,需要传递一个HttpServletRequest类型的参数(相当于就是实现多态的,用父类类型引用子类对象,调用子类方法)
- 包装类在实现接口的过程中,对于不需要包装的方法原封不动地调用被包装对象的方法来实现,对于需要包装的方法自己实现。
过滤器Filter把浏览器的请求传给自己定义的HttpServletRequestWrapper和HttpServletResponseWrapper进行把请求和响应的进行修改。HttpServletRequestWrapper在这个包装类中判断get请求,并对get请求的参数进行utf-8编码,过滤器再放行。
get请求和post请求统一编码的方式不同
post直接使用request.setCharacterEncoding("utf-8");//只对消息体有效response.setContenType("text/html;charset=utf-8");
get应为参数是在URL上的,不是在消息体中,不能用request.setCharacterEncoding("utf-8");//只对消息体有效;所以对请求头的内容无效,需要自行修改utf-8;response.setContenType("text/html;charset=utf-8");响应还是可以用response的。
案例3:Servlet3.0异步操作
案例4:Filter实现页面静态化