Web高级六 过滤器Filter

 

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接口;

扫描二维码关注公众号,回复: 3752277 查看本文章

第二步 :根据提示重写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对象并不是过滤器自己创建的。而是,从被过滤的资源中传递过来的。过滤器的执行流程如下:

  1. 客户端(浏览器)的HttpRequest到达Servlet之前,被Filter的doFilter()方法拦截;

  2. 根据需要,我们可以获取或者修改HttpRequest对象中的数据;

  3. 在这个请求响应给浏览器之前,Filter拦截了HttpResponse对象;

  4. 根据需要,我们可以获取或者修改HttpReponse对象中的数据;

  5. 最后,由doFilter中的chain决定是否让这个请求通过;


第五章 FIlter的生命周期

5.1 Filter类对象的创建与init()方法

5.1.1 Filter的创建

创建一个类的对象无非是通过无参构造有参构造,在自己定义的过滤器中并没有成员变量。所以,这个类的对象只能是通过无参构造来创建的。

5.1.2 init()方法

init()方法是在Filter类对象创建完成之后被调用的。

小结 :

  1. Filter类的对象是在服务器启动的时候创建的;

  2. Filter类对象创建完成后会调用init()方法;

question

1. 没有手动new这个类,它是怎么创建的呢 ?

答 : 反射技术调用这个类的构造方法创建;

2.创建完成后为什么要调用init()方法 ?

答 : nit方法中有一个参数filterConfig,这个参数能够获取一些配置信息。FilterConfig类中有4个方法,能够获取一些配置信息;

5.2 doFilter()方法

doFilter()方法是拦截请求的方法,只要一个请求符合Filter拦截路径,都会被doFilter()方法拦截。doFilter()方法有3个参数,这3个参数的作用分别如下:

5.3 destory()方法

过滤器的销毁方法。服务器停止或者将项目从服务器中移除的时候,销毁过滤器,调用一次destory方法。

  1. 过滤器是在服务器停止或者项目移除时销毁的;

  2. 过滤器销毁后会调用destroy()方法;

注:

destroy()方法通常是提供给tomcat在关闭前释放资源的一个机会;

过滤器的销毁方法。服务器停止或者将项目从服务器中移除的时候,销毁过滤器,调用一次destory方法。

小结 : Filter生命周期

  1. 当服务器启动的时候,过滤器就被初始化了,执行init()方法;

  2. 每当一个请求的路径满足过滤器的配置路径,那么就会执行一次过滤的deFilter()方法;

  3. 当服务器停止的时候,销毁过滤器,执行过滤器的destroy()方法;


第六章 Filter的映射路径

映射路径指的是当前这个Filter需要拦截的路径。这个路径的配置方式有两种:

  1. 精确匹配 : 匹配指定的URLpattern;

  2. 模糊匹配 : 匹配符合调教的一类路径;

6.1 精确匹配

精确匹配,要求访问的资源路径必须与Filter的urlPatterns中的配置一致

Filter的urlPatterns参数中也可以一次性配置多个路径

6.2 模糊匹配

模糊匹配主要有以下3种写法 :

猜你喜欢

转载自blog.csdn.net/wenzhengzheng/article/details/83244009
今日推荐