Web|Web 基础19 Filter入门
1.1Filter的概述
1.1.1 Filter的简介
- Filter也称之为过滤器,Filter是Servlet技术中最激动人心的技术,
- Filter可以管理WEB服务器中所有的WEB资源,
- Filter可以对JSP,Servlet,HTML,以及图片文件等进行拦截和过滤,
- Filter常用于实现一些特殊的功能,比如访问权限的控制,敏感词汇的过滤,乱码的处理等等,
- Filter其实就是一个特殊的Servlet,
- Servlet API提供了Filter接口,在WEB项目中,一个Java类实现了Filter接口,那这个Java类他就是Filter过滤器,
- Filter其实就是在用户访问目标资源之前,对请求和响应进行拦截过滤和处理。
??Filter和Listener是Servlet规范中的两个高级特性,不同于servlet ,他们不用于处理客户端请求,只用于对request,response进行修改,或者对context,session,request事件进行监听,为我们Servlet提供一些额外的辅助性功能,帮助我们简化开发。
1.1.3 Filter过滤器可以完成的事
- 让不让你过(检验用户是否登录)
- 改变你中间的内容(统一全站的字符编码,替换敏感词汇)
- 会有简单案例演示
- 在httpServletRequest到达Servlet之前,拦截客户的HTTPServletRequest
- 根据要求检查httpServletRequest,也可以修改httpServletRequest头和数据
- 在httpServletResponse到达Servlet之前,拦截客户的HTTPServletResponse
- 根据要求检查httpServletResponse,也可以修改httpServletResponse头和数据
- 图解
文章图片
Filter执行过程.png 在服务器与web资源之间,Filter对请求与响应进行操作
1.2 Filter的入门案例
- 在WEB项目中创建一个Java类,
- 让该类实现javax.servlet.Filter接口,
- 在该类中实现Filter接口的所有方法,
public class FilterDemo implements Filter {@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub}@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("FilterDemo执行");
//放行
chain.doFilter(request, response);
}@Override
public void destroy() {
// TODO Auto-generated method stub}}
- 在web.xml文件中进行相关的配置。
FilterDemo
FilterDemo
com.itheima.filter.FilterDemo
FilterDemo
/*
- 注意
- filter是一个特殊的Servlet,他的配置和Servlet是一样的
- 他和Servlet本质区别是
- 他不能产生一个请求或者响应,他只能修改某一资源的请求或者响应
- 必须要实现javax.servlet.Filter接口,需要在web.xml中进行配置才能生效
- Filter和特定的url关联,当用户请求访问此url时,才会触发filter调用doFilter这个方法
- 创建
- Filter对象在WEB服务器启动的时候,由WEB服务器帮我们创建
- init()
- Filter对象在WEB服务器启动的时候,由WEB服务器帮我们创建
- 销毁
- Filter对象在WEB服务器关闭的时候会被销毁
- destory()
- Filter对象在WEB服务器关闭的时候会被销毁
- Filter的生命周期和Servlet生命周期是一样.他们都提供了init()和destory()方法 .当web服务器启动的时候,就会自动调用init()方法进行初始化,当关闭
web服务器,关机,road整个项目的时候,就会调用destroy()方法来关闭filter
- 总结:
- 当web服务器启动的时候,filter就会被加载到内存,并且在调用destory()方法之前都会常驻内存
public class FilterDemo2 implements Filter {
public FilterDemo2() {
// TODO Auto-generated constructor stub
System.out.println("FilterDemo2的构造方法执行了");
}public void destroy() {
System.out.println("FilterDemo2的destory方法执行了");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("FilterDemo2的doFilter方法执行了");
chain.doFilter(request, response);
}public void init(FilterConfig fConfig) throws ServletException {
//这方法里面可以 获得 初始化参数
System.out.println("FilterDemo2的init方法执行了");
}}
1.4 Filter链 ??在同一个WEB应用中,可以开发编写多个Filter,那这多个Filter组成了一个链子,这个链子我们就称之为Filter链,
??WEB服务器在执行Filter链的时候,会根据Filter在web.xml文件中的配置顺序来执行。
- 注意:
- 多个filter对同一个资源进行处理的时候,他实际按照他在web.xml的配置顺序 从上到下 依次执行
- 要访问最后的web资源,需要所有的filter放行,如果其中有一个没有放行,用户是无法访问最后的web资源
- 所以filter的顺序放置需要注意 不然容易爆炸
- 在web.xml文件中,可以通过
标签来为Filter配置初始化参数, - WEB服务器在创建Filter对象的时候,会调用Filter对象的init方法,并且将封装了Filter初始化参数的FilterConfig对象传递进去,
- 在Filter的init方法中,就可以通过FilterConfig对象来获取Filter的初始化参数。
FilterDemo3
FilterDemo3
com.itheima.filter.FilterDemo3
usernamezhangsan
password123456
FilterDemo3
/*
【Web|Web 基础19 Filter入门】编写初始化方法
public class FilterDemo3 implements Filter {
private FilterConfig fConfig;
public void destroy() {
// TODO Auto-generated method stub
}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//fConfig.getInitParameter(name)chain.doFilter(request, response);
}public void init(FilterConfig fConfig) throws ServletException {
this.fConfig = fConfig;
//获取初始化参数
/*String username = fConfig.getInitParameter("username");
String password = fConfig.getInitParameter("password");
System.out.println(username);
System.out.println(password);
*///获取所有的初始化参数的name
Enumeration e = fConfig.getInitParameterNames();
while(e.hasMoreElements()) {
String name = e.nextElement();
//System.out.println(name);
String value = https://www.it610.com/article/fConfig.getInitParameter(name);
System.out.println(name +"=" + value);
}
}}
推荐阅读
- Python基础|Python基础 - 练习1
- 私有化轻量级持续集成部署方案--03-部署web服务(下)
- Java|Java基础——数组
- Java基础-高级特性-枚举实现状态机
- 营养基础学20180331(课间随笔)??
- iOS面试题--基础
- HTML基础--基本概念--跟着李南江学编程
- web网页模板|如此优秀的JS轮播图,写完老师都沉默了
- typeScript入门基础介绍
- spring|spring boot项目启动websocket