Fork me on GitHub

SpringBoot+Mybatis+PostMan(三):学习过滤器

Springboot+Mybatis+redis+postman项目实战总目录*

SpringBoot+Mybatis+PostMan(四):学习拦截器

SpringBoot+Mybatis+PostMan(五):token登陆认证过程一(token生成与认证)

SpringBoot+Mybatis+PostMan(五):token登陆认证过程二(redis缓存引入)

SpringBoot+Mybatis+PostMan(六):token登陆认证过程三(redis封装与干掉原来session,避免用户重复登陆)

番外篇:SpringBoot 用户注册时经MD5加密存入数据库

 

 

第二篇章:用户角色权限访问控制

 

SpringBoot+Mybatis+PostMan(七):用户角色权限访问控制入门(数据模拟实现,不带数据库)

 

SpringBoot+Mybatis+PostMan(八):用户角色权限访问控制一(数据库用户角色表查询组合)

 

SpringBoot+Mybatis+PostMan(九):用户角色权限访问控制二(加入资源表和资源角色对应表)

 

SpringBoot+Mybatis+PostMan(十):用户角色权限访问控制三(禁用session、启用token并集成redis)

 

 

首先我们要知道,过滤器和拦截器都是面向切面编程AOP的具体实现,过滤器依赖Servlet容器,属于Servlet规范的一部分。在实现上基于Servlet容器的函数回调,可以对几乎所有请求进行过滤。Filter的生命周期由Servlet容器管理。(Filter使用户可以改变一个 request和修改一个response,Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.。换种说法,filter其实是一个”servlet chaining”(servlet 链).。通俗点说法filter相当于加油站,request是条路,response是条路, 目的地是servlet,这个加油站设在什么地方对什么数据操作可以由你来控制。

项目代码获取地址:https://github.com/yeyuting-1314/testdemo_DM5_insert_page_token.git

现在就来完成过滤器相关配置和实现。

1. 生成特定过滤器

//过滤器生成
public class LogCostFilter implements Filter {
    
    //init()方法用来初始化过滤器,可以在init()方法中获取Filter中的初始化参数。
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    /*
     * doFilter()方法完成过滤操作。当请求发过来的时候,过滤器将执行doFilter方法。
     *在HttpServletRequest 执行doFilter()之前,根据需要检查 HttpServletRequest ,同时也可以修改HttpServletRequest 请求头和数据。
     *在HttpServletResponse 执行doFilter()之后,根据需要检查 HttpServletResponse ,同时也可以修改HttpServletResponse响应头和数据。
     * */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        //方法执行前先记录时间戳
        long start = System.currentTimeMillis() ;
        //通过过滤器链完成请求的执行
        filterChain.doFilter(servletRequest , servletResponse);
        //在返回结果之间计算执行的时间
        System.out.println("Executor cost = " + (System.currentTimeMillis()-start));

    }

    /*
     * destroy()
     *Filter对象创建后会驻留在内存,当web应用移除或服务器停止时调用destroy()方法进行销毁。
     * 在Web容器卸载 Filter 对象之前被调用。destroy()方法在Filter的生命周期中仅执行一次。
     * 通过destroy()方法,可以释放过滤器占用的资源。
     *
     * */
    @Override
    public void destroy() {

    }
}

2. 过滤器生成后,对刚生成的过滤器类进行实例化、执行顺序等进行配置

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean registerFilter(){
        FilterRegistrationBean registration = new FilterRegistrationBean() ;
        //实例化Filter类
        registration.setFilter(new LogCostFilter());
        //指定url的匹配模式
        registration.addUrlPatterns("/*");
        //设置过滤器名称和执行顺序
        registration.setName("LogCostFilter");
        registration.setOrder(1);
        return registration ;

    }
}

执行完毕后启动程序,发送请求,然后看控制台输出。

前端发送请求并获取到响应内容:

 

 控制台输出:过滤器实现了请求时间和响应时间之间时间差的获取和输出。

 

 这样一来,过滤器就顺利实现了对请求内容时间抓取和响应时间抓取并进行相关操作的过程。

至此,结束。

posted @ 2021-01-13 11:23  叶语婷  阅读(616)  评论(0编辑  收藏  举报