过滤器(Filter接口)
(1)作用:在请求资源(静态资源或动态资源),或者响应资源,或者请求和响应资源时,执行过滤任务。
(2)Filter的生命周期:
init方法:初始化方法。参数FilterConfig对象,用于读取Filter配置的init-param参数。
doFilter方法:执行过滤任务。每次访问目标资源时被执行。
参数一: ServletRequest,是HttpServletRequest接口的父类,可以强制转换为HttpServletREquest 参数二: ServletResponse,是HttpServletResponse的父类,可以强制转换为HttpServletResponse 参数三: FilterChain,是过滤器链对象。当一个资源同时被多个过滤器所过滤,那么就形成一个过滤器链。调用FilterChain的doFilter(request,response)方法,执行过滤器链的下一个过滤器,如果没有过滤器则调用目标资源。
destory方法:销毁Filter对象的时候调用。
(3)装饰者模式:当需要对某些类的方法进行增强,那么可以对该类进行装饰。
3.1编写一个装饰者类,继承被装饰者类(被装饰者类是非final的)
3.2声明一个成员变量,用于接收被装饰者类对象
3.3在装饰者类的构造方法中,接收被装饰者类对象。
3.4覆盖需要增强的方法。
(4) 解决参数中文乱码问题:
核心: MyHttpRequest装饰者类,对HttpServletRequest的getParameter方法进行增强。
getParameterValues("name")/ getParameterMap();
(5)网页内容压缩问题:
核心: MyHttpResponse装饰者类,对HttpServletResponse的getWriter方法进行增强。
让getWriter()方法返回带缓存功能的PrintWriter对象,这样PrintWriter的write方法写入的内容就直接写入到PinrtWriter中的缓存对象中。然后可以通过缓存对象取出内容。
ByteArrayOutputStreambuf = new ByteArrayOutputStream()
GZIPOutputStreamgzip = new GZIPOutputStream(buf);
gzip.write(内容);
gzip.finish(); //内容写入到ByteArrayOutputStream中
byte[]result = buf.toByteArray(); //从ByteArrayOutputStream中得到压缩后的内容
(6)登录权限的过滤
核心: SecurityFilter过滤器中,进行登录权限的判断,这个过滤器要过滤哪些需要权限才能访问的资源。(注意:不要过滤登录页面,登录的servlet)
if(session==null){
没有权限的处理
}else{
Stringuser = (String)session.getAttribute("user");
if(user==null){
没有权限的处理
}
}
//登录成功后,应该要放行资源
chain.doFilter(request,response);