Filter、Interceptor的使用

2023-11-02

一、Filter、Interceptor的区别

1.1、过滤器(Filter)

它依赖于servlet容器。它可以对几乎所有请求进行过滤。使用过滤器的目的,是用来做一些过滤操作,获取我们想要获取的数据,比如:在Javaweb中,对传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者Controller进行业务逻辑操作。

通常用的场景是:在过滤器中修改字符编码(CharacterEncodingFilter)、在过滤器中修改HttpServletRequest的一些参数(XSSFilter(自定义过滤器)),如:过滤低俗文字、危险字符等。

1.2、拦截器(Interceptor)

它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制。

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

二、Filter、Interceptor的使用

2.1、Filter 的实现步骤

1、创建一个类,实现 Filter 接口,重写抽象方法
2、类上标记@WebFilter(“要拦截的资源”)
3、引导类标记@ServletComponentScan

@WebFilter(urlPatterns = {"/depts"})
public class MyFilter implements Filter {
    /** 
     * 初始化
     * */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("MyFilter======>初始化操作~~~~~~");
    }
    /**
     * 拦截操作
     * */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //放行前执行的业务逻辑
        System.out.println("MyFilter======>校验参数~~~~~~");
        System.out.println("MyFilter======>参数校验成功放行~~~~~~~~~");
        // 放行方法
        filterChain.doFilter(servletRequest,servletResponse);
        //放行后执行的业务逻辑
        System.out.println("MyFilter======>执行 doFilter 方法成功~~~~~~~~~");
    }
    /**
     * 销毁
     * */
    @Override
    public void destroy() {
        System.out.println("MyFilter======>销毁操作~~~~~~~");
    }
}

2.2、Interception 结合JWT 的实现步骤

1、创建一个类,实现 HandlerInterceptor
2、类上标记 @Component 注解,注入到容器中
3、注册拦截器
3.1、创建一个配置类,实现 WebMvcConfigurer
3.2、重写 addInterceptors 方法,增加拦截器并编写拦截规则
3.3、注册拦截器

@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * @description  在Handler执行之前执行,一般用于权限控制
     * @Author  Wangp
     * @date    14:18 2023/4/11
     * @param	request
     * @param	response
     * @param	handler
     * @return  boolean
    */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        // 1.获取请求路径
        String uri = request.getRequestURI();
        StringBuffer url = request.getRequestURL();
        log.info("获取的请求地址uri======>{},url=========>{}",uri,url);

        response.setContentType("application/json;charset=UTF-8");
        ObjectMapper objectMapper = new ObjectMapper();
        // 2.获取 校验参数 (token)
        String token = request.getHeader("token");
        log.info("获取的token是======》{}",token);
        if (token == null || "".equals(token)) {
            Result result = Result.error("NOT_LOGIN");
            String resultJson = objectMapper.writeValueAsString(result);
            log.info("result=========>{}",result);
            response.getWriter().write(resultJson);
            return false;
        }

        // 4.解析 jwt令牌
        try {
            JwtUtils.parseJWT(token);
        } catch (Exception e) {
            e.printStackTrace();
            Result result = Result.error("NOT_LOGIN");
            String resultJson = objectMapper.writeValueAsString(result);
            log.info("resultJson==============>",result);
            response.getWriter().write(resultJson);
            return false;
        }
        // 5.放行
        return true;
    }

    /**
     * @description  在Handler执行之后,渲染视图之前执行
     * @Author  Wangp
     * @date    14:19 2023/4/11
     * @param	request	
     * @param	response	
     * @param	handler	
     * @param	modelAndView	
     * @return  void
    */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("在Handler执行之后,渲染视图之前执行");
    }

    /**
     * @description  所有操作结束之后执行,一般用于释放资源
     * @Author  Wangp
     * @date    14:19 2023/4/11
     * @param	request	
     * @param	response	
     * @param	handler	
     * @param	ex	
     * @return  void
    */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("所有操作结束之后执行,一般用于释放资源");
    }
}

@Configuration
public class LoginConfigurer implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
    }
}

三、Filter、Interception详解

3.1、Filter 详解

init 初始化方法只会执行一次,Tomcat启动时,创建Filter时,init执行了
destory销毁方法只会执行一次,Tomcat停止时,销毁Filter时,destory执行
doFilter过滤方法拦截到一个请求就执行一次,拦截资源根据需求做处理

1、执行流程

在这里插入图片描述

2、拦截路径配置

在这里插入图片描述

3、过滤器链:过滤器链的执行顺序按过滤器类名进行排序

在这里插入图片描述

3.2、Interception详解

1、拦截路径

在这里插入图片描述

2、执行流程:请求先过滤器,再到拦截器,再到Handler。响应时,先到拦截器,再到过滤器

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Filter、Interceptor的使用 的相关文章

随机推荐

  • jdbc获取一行字符串_JDBC基础

    什么是JDBC JDBC就是Java程序访问数据库的规范 是一个规范定义接口 各种数据库厂家实现了JDBC这个接口 这些实现类就是数据库驱动 使用时只需要调用接口中的方法即可 不用关注类是如何实现的 JDBC的核心API有以下几种 Driv
  • 前端学习——css盒子模型、css3新特性、伪类、布局0711TODO

    样式还是得具体使用才能理解 不然会忘记也理解不透彻 还有定位 元素溢出 浮动 布局水平 垂直对齐 css3新特性 1过渡 2 动画 3 2D 3D转换 伪类 三种定位方式 弹性布局 栅格布局
  • 餐馆(餐馆有n张桌子,每张桌子有一个参数a 可容纳的最大人数; 有m批客人,每批客人有两个参数:b人数,c预计消费金额。 不允许拼桌的情况下,选择其中一部分客人,使得总预计消费金额最大)

    餐馆 某餐馆有n张桌子 每张桌子有一个参数 a 可容纳的最大人数 有m批客人 每批客人有两个参数 b人数 c预计消费金额 在不允许拼桌的情况下 请实现一个算法选择其中一部分客人 使得总预计消费金额最大 输入描述 输入包括m 2行 第一行两个
  • (手工)【sqli-labs42、43】POST注入、堆叠注入、错误回显、字符型注入

    目录 一 推荐 二 手工 SQL注入基本步骤 三 Less42 POST Error based String Stacked 3 1 简介 堆叠注入 错误回显 字符型注入 3 1 第一步 注入点测试 3 3 第二步 分析过滤 3 4 第三
  • 微软华裔科学家和他们的又一次冲动

    站在放映着自己照片的大屏幕前 对着现场的300人 西装革履的李世鹏有点紧张 发言稿是事先写好的 但他时不时中断几秒 好像忘了词儿 金山CEO张宏江揶揄瞬间转换身份的他 有点做作 微软门徒 李世鹏 在一幅拍摄于2001年的照片上 李世鹏与比尔
  • VsCode必备插件

    open in browser 安装浏览器插件 用于访问html页面 在 扩展栏 的搜索框中输入 open in browser 使用 Alt B 使用默认浏览器打开当前 html 页面 或 Shift Alt B 选择其他浏览器 Vetu
  • 【第十三讲】TMS320F28335开发板之DMA模块

    直接存储器访问 DMA 模块 一 内存与外设进行数据交换的方式 中断方式 每传输一次数据 就必须经历中断处理的全部步骤 而且一般需要借助CPU内部的寄存器作为中介 也就是说CPU需要从来源把每一片段的资料复制到暂存器 然后把它们再次写回到新
  • Vue 组件基础

    VUE 一 开发工具 VUE开发环境个人推荐使用VS code 然后安装特定的插件即可开发 可用插件如下 Vetur 语法高亮 智能感知 Emmet等 EsLint 语法纠错 Auto Close Tag 自动闭合HTML XML标签 Au
  • kibana常见启动报错

    环境 Ubuntu16 04 报错1 连接elasticsearch kibana启动报错 报错信息 Status changed from uninitialized to green Ready log 08 29 01 886 err
  • ModelSim的入门仿真步骤(图文干货)

    ModelSim仿真分为以下6个主要步骤 1 新建工程 2 新建或导入工程文件 3 文档编译 4 开始仿真 5 添加仿真波形 6 调整仿真时间 1 新建工程 点击左上角 File Project 弹出如下界面 在 Project Name
  • qt提升控件之后,编译报错

    引言 自定义的控件 在ui文件中将控件提升为自定义的控件 提升的时候没有指明提升的头文件的相对路径或者绝对路径 导致编译的时候无法找到相应的头文件 解决方法 1 在被提升的类的头文件前添加本机电脑所在的相对路径 2 在被提升的类的头文件前添
  • leveldb常见问题以及性能优化点

    本篇是leveldb最后一篇 这里主要把技术核心点 性能提升点或者面试可能会被问到进行总结 一 常见问题 1 leveldb key value内存 内存中保存的是所有key value吗 答 不是 搜索顺序 memtable immtab
  • 利用MATLAB中的newrb函数进行函数逼近

    RBF函数在神经网络控制中较为常见 MATLAB中早已集成了一个newrb的函数 在一些场景下使用起来还比较方便 尤其是涉及到进行函数逼近的时候 参考链接 http blog sina com cn s blog 9b8d0abd0101o
  • Android Studio连接自带模拟器失败怎么办?强烈建议使用第三方模拟器(含各类模拟器下载地址)

    学习安卓开发的小伙伴必然会碰到模拟器的启动问题 就算成功启动Android Studio自带的模拟器 使用起来也是十分缓慢 有时候卡起来是真想骂娘 服了他个老六 那么这个时候 如果有一个第三方模拟器 不仅简单好用 无需配置 而且美观快速零卡
  • 华为存储特性

    华为存储特性 1 SmartPartition SmartPartition是一种性能特性 根据不同业务特点分配存储系统的缓存资源来满足不同应用系统的服务质量要求 由于单个存储系统要面对的应用数量急剧增加 且各业务应用之间的I O特征不同
  • Android-第五节Menu菜单详解

    目录 一 Menu背景 二 Menu使用步骤 1 创建menu 2 设计menu 3 重写menu逻辑代码 4 运行效果 一 Menu背景 手机毕竟和电脑不同 它的屏幕空间非常有限 因此充分地利用屏幕空间在手机界面设计中就显得非常重要了 如
  • STM32 使用TIM2_CH1(PA15) 输出10K PWM信号

    PA15 gt TIM2 Remap CH1 1 apb init RCC APB1PeriphClockCmd RCC APB1Periph TIM2 ENABLE RCC APB2PeriphClockCmd RCC APB2Perip
  • JMM java内存模型

    java内存模型 即 java memory model 它定义了主存 工作内存抽象概念 底层对应着 CPU 寄存器 缓存 硬件内存 CPU 指令优化等 JMM 体现在以下几个方面 原子性 保证指令不会受到线程上下文切换的影响 可见性 保证
  • android 安装命令,【转载】android中APK包的安装以及adb命令的使用

    1 首先将 android sdk platform tools添加都path路径下 2 在控制台窗口中进入到你apk包所在的目录中 3 输入 abd unremount 第一次使用该命令的时候需要获取该命令的操作权限 4 打开androi
  • Filter、Interceptor的使用

    Filter Interceptor的使用 一 Filter Interceptor的区别 1 1 过滤器 Filter 1 2 拦截器 Interceptor 二 Filter Interceptor的使用 2 1 Filter 的实现步