我今天学习了过滤器(filter)的知识,是冯老师讲的课,我做了简单的笔记:
Servlet过滤器(Filter):不限定于具体的协议
一、 使用拦截设置请求字符编码,过滤非法文字,验证客户是否已经登陆,
二、 编写过滤器:
a) 建立一个class,实现Filter接口,有三个方法,是过滤器生命周期的方法,init()初始化:执行一次,doFilter()完成过滤任务:执行多次,destroy()过滤器销毁:执行一次,(先实例化,后初始化),有请求时才执行doFilter方法,
b) 在web.xml里面注册过滤器: ( /* )代表拦截所有的文件 <filter><filter-name> </filter-name><filter-class><filter-class></filter> 配置映射信息:<filter-mapping><filter-name></filter-name> <url-pattern>/*</url-pattern> </filter-maping>
c) 在doFilter()里面放行:chain.doFilter(request,repsonse);
三、 初始化方法:Init(FilterConfig filterConfig ):读取过滤器的初始化参数:filterConfig.getInitParameter(“nba”); 使用枚举读取: Enum em =filterConfig.getInitParamternames(); 输出上下文参数;filterCOnfig.getServletcontext.getInitparamternames()
四、 doFilter( ):将request转型: HttpServletRequest req= (HttpServletRequest)request
a)
五、 过滤器的应用:字符编码的过滤器
a) 通过配置参数encoding指明使用何种字符编码,以处理Html Form请求参数的中文问题
b) 使用方法:在过滤器的doFilter( )里面设置请求字符编码: HttpServletRequest req= (HttpServletRequest)request ; String encoding=req.getetCharaterEncoding if(encoding==null) req.setCharaterEncoding(“utf-8”);
c) 使用方法2:在Filter里面配置初始化参数<init-param>encoding:在init()里面读取参数:
六、 只拦截一个servlet:
a)
b) 拦截所有servlet:将servlet路径改为:
c)
d) 拦截某一目录的所有文件:
e)
七、 拦截转发:<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST. 可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。
a) <dispatcher> 子元素可以设置的值及其意义:
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
b)
c)
八、 Servlet过滤器对响应的过滤:
a) A.过滤器截获客户端的请求.
B.重新封装ServletResponse,在封装后的 ServletResponse中提供用户自定义的输出流.
C.将请求向后续传递.
D.Web组件产生响应.
E.从封装后的ServletResponse中获取用户自定义的输出流.
F.将响应内容通过用户自定义的输出流写入到缓冲流中.
G.在缓冲流中修改响应的内容后清空缓冲流,输出响应内容.
b) 应用:使浏览器不缓存页面的过滤器:
i. 强转(HttpServletResponse )response;
ii. 有 3 个 HTTP 响应头字段都可以禁止浏览器缓存当前页面,它们在 Servlet 中的示例代码如下:
//设定网页的到期时间,一旦过期则必须到服务器上重新调用
response.setDateHeader("Expires",-1);
// Cache-Control指定请求和响应遵循的缓存机制 no-cache指示请求或响应消息不能缓存
response.setHeader("Cache-Control","no-cache");
//是用于设定禁止浏览器从本地机的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出
response.setHeader("Pragma","no-cache");
并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头
九、 当一个web应用中有多个过滤器时,web 容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链),Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致。(即<fiter-mapping>的先后顺序,而与<filter>的顺序无关)
十、 过滤器应用:检测用户是否登陆
a) 方法一:利用session,在登陆页面放置session,在每个页面获取session,获取不到,则转到登陆页面,
b) 方法二:利用Filter:
i. 在web.xml里面配置:
ii.
iii.
iv.
v. 在servlet获取配置信息,放置session:
vi.
vii. 在过滤器的init()里面读取配置参数:
viii.
ix.
x.
xi. 在doFilter()的判断:
xii.
xiii.
xiv.
xv. ,在过滤器的doFilter( )里面,转换request和response,利用request获取session,获取session的值,如果获取不到session,则转到登陆页面,如果获取到了,则放行,
十一、 装饰模式:
a) 装饰 HttpServletRequest 对象
i. 需求:在 HttpServletRequest 对象到达 Servlet 之前把用户输入的多余空格都去掉
ii. 情景:因为 HttpServletRequest 对象里的请求参数都实际包含在 java.util.Map 对象里,而Map是不允许修改的,所以包含在 HttpServletRequest 对象里的请求参数不能被修改
iii. 解决方案:采取 Decorator(装饰器)模式
b) HttpServletRequestWrapper 类:
i. Servlet API 中提供了一个 HttpServletRequestWrapper 类来包装原始的 request 对象, HttpServletRequestWrapper 类实现了 HttpServletRequest 接口中的所有方法,这些方法的内部实现都是仅仅调用了一下所包装的的 request 对象的对应方法
ii. 相类似ServletAPI也提供了一个 HttpServletResponseWrapper 类来包装原始的 response 对象
十二、 过滤器应用:过滤不雅文字和HTML特殊字符
a) 步骤:建立一个过滤器:将request和response转型,
b) 建立一个class: myHttpServletWrapper继承HttpServletWrapper
c) 在过滤器里面:new myHttpServletWrapper();
d) 建立一个资源属性文件:存放待替换的字符:
e) 在myHttpServletWrapper里面加载属性文件,检查页面输入的字符是否包含属性文件的字符,
总结:过滤器有很多功能:设置请求字符编码,过滤非法文字,验证客户是否已经登陆,这些都是如今的互联网上都经常使用的功能,因此要多加练习,彻底掌握过滤器的使用。