spring boot 过滤器_kotlin从入门到进阶实战

spring boot 过滤器_kotlin从入门到进阶实战过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Spring Boot是很优秀的框架,它的出现简化了新Spring应用的初始搭建以及开发过程,大大减少了代码量,目前已被大多数企业认可和使用。这个专栏将对Spring Boot框架从浅入深,从实战到进阶,不但我们要懂得如何去使用,还要去剖析框架源码,学习其优秀的设计思想。

汇总目录链接:【Spring Boot实战与进阶】学习目录

一、过滤器

  过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。

1、自定义一个TimeFilter类

@Component
@WebFilter(urlPatterns = { 
   "/*"})
public class TimeFilter implements Filter{ 
   
    Logger log = LoggerFactory.getLogger(Logger.class);
    @Override
    public void init(FilterConfig filterConfig) throws ServletException { 
   
        log.info("【过滤器】初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 
   
        log.info("【过滤器】开始执行");
        Long startTime = System.currentTimeMillis();
        filterChain.doFilter(servletRequest, servletResponse);
        log.info("【过滤器】耗时:" + (System.currentTimeMillis() - startTime)+"ms");
        log.info("【过滤器】结束执行");
    }

    @Override
    public void destroy() { 
   
        log.info("【过滤器】销毁");
    }
}

2、配置方式

  • @WebFilter注解的urlPatterns属性配置了哪些请求可以进入该过滤器,/*表示所有请求。
  • 除了在过滤器类上加注解外,我们也可以通过FilterRegistrationBean来注册过滤器。定义一个TimeFilterConfig类,加上@Configuration注解表明其为配置类,然后通过FilterRegistrationBean来注册过滤器。
public class TimeFilterConfig { 
   
    @Bean
    public FilterRegistrationBean timeFilter() { 
   
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        TimeFilter timeFilter = new TimeFilter();
        filterRegistrationBean.setFilter(timeFilter);

        List<String> urlList = new ArrayList<>();
        urlList.add("/*");

        filterRegistrationBean.setUrlPatterns(urlList);
        return filterRegistrationBean;
    }
}

3、项目演示

@RestController
public class HelloController { 
   
    Logger log = LoggerFactory.getLogger(Logger.class);

    @RequestMapping("hello")
    public void hello(){ 
   
        log.info("Controller:Hello World!");
    }
}

启动项目,可以在控制台看到输出了过滤器初始化,访问http://localhost:8080/hello

控制台输出

【过滤器】开始执行
Controller:Hello World!
【过滤器】耗时:26ms
【过滤器】结束执行

二、拦截器

  拦截器,是面向切面编程(AOP,Aspect Oriented Program)的。就是在Service或者一个方法前调用一个方法,或者在方法后调用一个方法。比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。

1、定义一个TimeInterceptor类

@Component
public class TimeInterceptor implements HandlerInterceptor { 
   
    Logger log = LoggerFactory.getLogger(Logger.class);
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { 
   
        log.info("【拦截器】处理前");
        httpServletRequest.setAttribute("startTime", System.currentTimeMillis());
        log.info(((HandlerMethod) o).getBean().getClass().getName());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { 
   
        log.info("【拦截器】处理中");
        Long start = (Long) httpServletRequest.getAttribute("startTime");
        log.info("【拦截器】耗时:" + (System.currentTimeMillis() - start)+"ms");
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { 
   
        log.info("【拦截器】处理后");
        Long start = (Long) httpServletRequest.getAttribute("startTime");
        log.info("【拦截器】耗时:" + (System.currentTimeMillis() - start)+"ms");
    }
}

2、在TimeInterceptorConfig中通过InterceptorRegistry注册过滤器。

@Configuration
public class TimeInterceptorConfig extends WebMvcConfigurerAdapter { 
   
    @Autowired
    private TimeInterceptor timeInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) { 
   
        registry.addInterceptor(timeInterceptor);
    }
}

3、项目演示

@RestController
public class HelloController { 
   
    Logger log = LoggerFactory.getLogger(Logger.class);

    @RequestMapping("hello")
    public void hello(){ 
   
        log.info("Controller:Hello World!");
    }
}

启动项目,访问http://localhost:8080/hello

控制台输出

【拦截器】处理前
com.boot.filter.controller.HelloController
Controller:Hello World!
【拦截器】处理中
【拦截器】耗时:22ms
【拦截器】处理后
【拦截器】耗时:22ms

三、过滤器和拦截器的区别

主要区别:
1、拦截器是基于Java的反射机制的,而过滤器是基于函数回调。
2、拦截器不依赖于servlet容器,过滤器依赖于servlet容器。
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
6、拦截器可以获取IOC容器中的各个bean(基于FactoryBean接口 ),而过滤器就不行,在拦截器里注入一个service,可以调用业务逻辑。

本质区别:
   从灵活性上说拦截器功能更强大些,Filter能做的事情它都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验,其他的还是建议用interceptor。

执行顺序:

【过滤器】开始执行
【拦截器】处理前
com.boot.filter.controller.HelloController
Controller:Hello World!
【拦截器】处理中
【拦截器】耗时:20ms
【拦截器】处理后
【拦截器】耗时:20ms
【过滤器】耗时:27ms
【过滤器】结束执行

过滤前—–拦截前—–Action处理—–拦截后—–过滤后。
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/172398.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Ajax教程_ajax是服务器端动态网页技术

    Ajax教程_ajax是服务器端动态网页技术Ajax教程Ajax能做什么Ajax是一种异步请求数据的web开发技术,目前主要用于异步,大家都知道,浏览器主线程是单线程的,也就是一次只能干一件事,以Ajax就是让浏览器当主线程完成后去干别的事

    2022年8月4日
    3
  • arm linux启动过程_项目冷启动和热启动的区别

    arm linux启动过程_项目冷启动和热启动的区别微处理器:LPC2114编译环境:KeilMDKV4.10思路:常把单片机系统的复位分为冷启动和热启动。所谓冷启动,也就是一般所说的上电复位,冷启动后片内外RAM的内容是随机的,通常是0x00或0xFF;单片机的热启动是通过外部电路给运行中的单片机的复位端一复位电平而实现的,也就是所说的按键复位或看门狗复位。复位后,RAM的内容都没有改变。在某些场合,必须区分出设备的重启是热重启还是冷重启。常…

    2022年10月30日
    0
  • Hadoop安装与配置详细教程「建议收藏」

    Hadoop安装与配置详细教程「建议收藏」【确保服务器集群安装和配置已经完成!】前言请根据读者的自身情况,进行相应随机应变。我的三台CentOS7服务器:主机:master(192.168.56.110)从机:slave0(192.168.56.111)从机:slave1(192.168.56.112)每一个节点的安装与配置是相同的,在实际工作中,通常在master节点上完成安装和配置后,然后将安装目录复制到其他节点就可以,…

    2022年5月31日
    46
  • java8中LocalDate和Date之间的转换

    java8中LocalDate和Date之间的转换因为切换到了java8,但是一些东西还是使用的importjava.util.Date对象表示的,所以需要对他们进行转换,封装了一个工具类,具体,如下:/***张科*2019年1月14日20:55:54*/publicclassDateAndLocalDateUtil{/***localDate转Date*/…

    2022年10月3日
    0
  • linux 放开8080端口命令_linux开放端口命令

    linux 放开8080端口命令_linux开放端口命令1.centos7版本对防火墙进行加强,不再使用原来的iptables,启用firewall1.查看已开放的端口(默认不开放任何端口)firewall-cmd–list-ports2.开启80端口firewall-cmd–zone=public(作用域)–add-port=80/tcp(端口和访问类型)–permanent(永久生效)firewall-cmd–zone=pub…

    2022年9月6日
    2
  • social engineering databese_social engineering attack

    social engineering databese_social engineering attack请不要用于非法用途!!!(全部搜集自互联网,作者不负法律责任,不能保证可用性)QQ群:https://qqgroup.insight-labs.orghttps://s3.amazonaws.com/qqqun./index.html(与insight-labs类似)www.weigongkai.comhttp://qun.594sgk.c…

    2022年10月5日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号