1.1 过滤器是什么
过滤器(filter)本质是Java中预先定义好了不同的接口,可以过滤不同的内容,具体怎么过滤,需要使用者定义一个实现类,然后实现接口中的过滤方法,在方法中书写过滤的条件。filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行。
1.2 为什么要使用过滤器
在我们实际项目中,我们对访问某些资源的请求需要进条件的筛选、过滤。当这个请求满足特定的情况,才能让这个请求访问目标资源,如果不满足条件,就不让访问目标资源。比如,我们在论坛上发帖,网站往往需要对所发的内容进行过滤,如果有不合适的字眼,就需要对其特殊处理。这就是通过过滤器来完成的。
第二章 过滤器的应用场景
2.1 过滤论坛中的非法字符
上论坛或者贴吧这类的网站浏览信息时,很多评论有时候是携带脏词的。而这些脏词不能显示出来,使用**代替了。类似这类的脏词过滤,可以通过java中的过滤器,对请求参数中的脏词进行过滤。
2.2 登陆权限检查
当客户端浏览器发出一个请求,这个请求在访问到正真的目标资源之前,需要进行登录权限的检查。如果已经登录,就让这个请求通过,访问资源;如果没有登录,不能让请求访问目标资源。这样的操作需要在访问具体资源进行条件的过滤,可以使用过滤器来完成。
对大多数servlet中公共代码的提取!!!!
第三章 过滤器开发入门
3.1 过滤器API简介
Filter是java. servlet包下面的一个接口,定义了3个方法。
3.2 过滤器开发步骤
项目中如果需要使用到过滤器,使用Servlet3.0的注解方式进行创建。
创建步骤 :
第一步 : 新建一个普通java类,实现Filter接口;
第二步 :根据提示重写Filter接口的3个方法;
第三步 : 通过注解的方式配置这个Filter;
注解@WebFilter:配置Filter的注解,这个注解有两个参数;
filterName:设置过滤器的名称;
urlPatterns:配置这个过滤器要拦截的资源的路径;
第四步 : 在doFilter() 方法中,书写过滤的业务逻辑;
chain.doFilter()方法放行;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理post请求和响应乱码问题
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//在session容器中存储数据
request.getSession().setAttribute("name", "张三");
//重定向到首页
response.sendRedirect("index.jsp");
}
}
@WebFilter(filterName = "MyFilter", urlPatterns = {"/login","/index.jsp"})
public class MyFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//执行过滤的方法 :
//将ServletRequest对象强转成HttpServletRequest对象
HttpServletRequest request = (HttpServletRequest) req;
//获取请求路径
StringBuffer url = request.getRequestURL();
System.out.println("拦截了请求:"+url);
//放行
chain.doFilter(request,resp);
}
public void destroy() {
}
}
注 :
过滤器doFilter方法默认拦截请求,如果需要经过过滤器之后,可以继续访问资源,要使用chain.doFilter()方法进行放行。
第四章 FIlter的的执行流程
过滤器的doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)方法中的request对象和response对象并不是过滤器自己创建的。而是,从被过滤的资源中传递过来的。过滤器的执行流程如下:
-
客户端(浏览器)的HttpRequest到达Servlet之前,被Filter的doFilter()方法拦截;
-
根据需要,我们可以获取或者修改HttpRequest对象中的数据;
-
在这个请求响应给浏览器之前,Filter拦截了HttpResponse对象;
-
根据需要,我们可以获取或者修改HttpReponse对象中的数据;
-
最后,由doFilter中的chain决定是否让这个请求通过;
第五章 FIlter的生命周期
5.1 Filter类对象的创建与init()方法
5.1.1 Filter的创建
创建一个类的对象无非是通过无参构造 和有参构造,在自己定义的过滤器中并没有成员变量。所以,这个类的对象只能是通过无参构造来创建的。
5.1.2 init()方法
init()方法是在Filter类对象创建完成之后被调用的。
小结 :
-
Filter类的对象是在服务器启动的时候创建的;
-
Filter类对象创建完成后会调用init()方法;
question
1. 没有手动new这个类,它是怎么创建的呢 ?
答 : 反射技术调用这个类的构造方法创建;
2.创建完成后为什么要调用init()方法 ?
答 : nit方法中有一个参数filterConfig,这个参数能够获取一些配置信息。FilterConfig类中有4个方法,能够获取一些配置信息;
5.2 doFilter()方法
doFilter()方法是拦截请求的方法,只要一个请求符合Filter拦截路径,都会被doFilter()方法拦截。doFilter()方法有3个参数,这3个参数的作用分别如下:
5.3 destory()方法
过滤器的销毁方法。服务器停止或者将项目从服务器中移除的时候,销毁过滤器,调用一次destory方法。
-
过滤器是在服务器停止或者项目移除时销毁的;
-
过滤器销毁后会调用destroy()方法;
注:
destroy()方法通常是提供给tomcat在关闭前释放资源的一个机会;
过滤器的销毁方法。服务器停止或者将项目从服务器中移除的时候,销毁过滤器,调用一次destory方法。
小结 : Filter生命周期
-
当服务器启动的时候,过滤器就被初始化了,执行init()方法;
-
每当一个请求的路径满足过滤器的配置路径,那么就会执行一次过滤的deFilter()方法;
-
当服务器停止的时候,销毁过滤器,执行过滤器的destroy()方法;
第六章 Filter的映射路径
映射路径指的是当前这个Filter需要拦截的路径。这个路径的配置方式有两种:
-
精确匹配 : 匹配指定的URLpattern;
-
模糊匹配 : 匹配符合调教的一类路径;
6.1 精确匹配
精确匹配,要求访问的资源路径必须与Filter的urlPatterns中的配置一致。
Filter的urlPatterns参数中也可以一次性配置多个路径
6.2 模糊匹配
模糊匹配主要有以下3种写法 :