过滤器和拦截器的基本知识

news2024/11/24 12:05:05

过滤器和拦截器的基本知识

前提提要,由于过滤器和拦截器的相关函数是没有返回值的,所以我们像前端返回数据时需要使用到HttpServletResponse中的相关函数,且需要配合阿里巴巴的插件fastjson将返回信息转为json格式,或者使用gson转为json

  • fastjson使用示例
HttpServletResponse response = (HttpServletResponse) servletResponse;
Result result = Result.error("NOT_LOGIN");
String notLogin = JSONObject.toJSONString(result);
response.getWriter().write(notLogin);
  • gson使用实例:
private GSon gson;
@Test
public void testJSON()
{
	String json = gson.toJson(Result.success());
	System.out.println(json);
}

一、过滤器

过滤器是javaWeb的三大组件之一,所以我们在使用过滤器是需要在启动类添加注解@ServletComponentScan, 表明该springboot工程支持Servlet组件扫描

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

import javax.servlet.annotation.WebFilter;
// 表明支持Servlet组件扫描
@ServletComponentScan
@SpringBootApplication
public class TiliasWebManagementApplication {

    public static void main(String[] args) {
        SpringApplication.run(TiliasWebManagementApplication.class, args);
    }

}

使用过滤器我们一般需要实现三个函数,分别是

  • init —>这个函数提供了默认实现,可以不实现
  • doFilter -->核心函数
  • destory -->同样提供了默认实现,可以不实现

在这里插入图片描述

1、执行流程

在这里插入图片描述

 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 
 {
     // filterChain.doFilter之前的操作为放行前的操作,像身份验证这些需要判断的一般都是filterChain.doFilter执行前完成的
     
     //放行,即如果前面的过滤条件满足,则将请求发送给对应的执行函数进行后续操作
    filterChain.doFilter(servletRequest, servletResponse);
     
     // filterChain.doFilter之后的操作为放行后的操作
 }

下面是一个登录验证的操作

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        // 获取URL
        String url = request.getRequestURI().toString();
        if (url.contains("login")) {
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }

        // 获取token
        String jwt = request.getHeader("token");
        log.info("token = {}", jwt);
        // 如果token为空,但会未登录信号
        if (!StringUtils.hasLength(jwt)) {
            Result result = Result.error("NOT_LOGIN");
            String notLogin = JSONObject.toJSONString(result);
            response.getWriter().write(notLogin);
            return;
        }
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("jwt令牌无效");
            Result result = Result.error("NOT_LOGIN");
            String notLogin = JSONObject.toJSONString(result);
            response.getWriter().write(notLogin);
            return;
        }
        //放行
        filterChain.doFilter(servletRequest, servletResponse);
    }

二、拦截器

拦截器的使用一般还需要配合一个配置类的使用,所以拦截器实现相较于过滤器略显复杂,但也相差无几

在这里插入图片描述

拦截器的使用一般需要添加一个配置类,该配置类需要实现WebMvcConfigurer中的addInterceptors方法

package com.example.config;

import com.example.interceptor.LoginCheckInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 拦截器配置类
 */
// Configuration 设置该类为一个配置类
@Slf4j
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginCheckInterceptor loginCheckInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册一个拦截器,拦截除了/login之外的所有请求
        registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
    }

}

拦截器同样有三个重要函数,实现效果跟Filter类似

  • preHandle -->放行前的操作
  • postHandle -->放行后的操作
  • afterCompletion–>最后执行的操作

其中,拦截器更精细化的控制前端的请求

在这里插入图片描述

  • 使用示例
package com.example.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.example.pojo.Result;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 拦截器处理逻辑
 */
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override
    // 目标资源方法前执行,true为方行,false为拦截
    // 与doFilter的fileChain前执行的方法类似
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取token
        String token = request.getHeader("token");
        // 如果token为空,返回未登录信号
        if(!StringUtils.hasLength(token)){
            Result error = Result.error("NOT_LOGIN");
            String notLogin = JSONObject.toJSONString(error);
            response.getWriter().write(notLogin);
            return false;
        }
        // 放行
        return true;
    }

    @Override
    // 目标资源方法后执行后执行
    // 与doFilter的fileChain后执行的方法类似
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    @Override
    // 试图渲染完毕后执行,最后执行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}

需要注意的是,拦截器的放行和拦截是使用true和false来指定的,true表明放行,false表明拦截

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1831460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络运维:企业数字化转型的基石

在数字化时代,网络已经成为企业运营不可或缺的一部分。网络运维作为确保网络稳定、安全和高效运行的关键环节,其重要性不言而喻。本文将探讨网络运维的重要性,并分析其在企业数字化转型中的作用。 网络运维的定义 网络运维,也称…

(自动深色模式)Windows 10 Auto Dark Mode

需求 想让Win10像手机那样,到点自动切换深色模式/浅色模式 解决方案 Windows 10 Auto Dark Mode – Win10 自动深色模式 GitHub:https://github.com/Armin2208/Windows-Auto-Night-Mode/

【Python】PySide6使用入门和注意事项

文章目录 前言关于PySide和PyQtQt Designerpyside6在vscode中ui文件转换兼容性问题主程序结构蓝牙协议初探(应用层) 前言 最近在开发一个带界面的软件,需要使用蓝牙,然后找到一个开源仓库使用的是Qt里面的Qbluetooth模块&#xff…

使用ARK工具ATool清除典型蠕虫MyDoom

1 概述 在长期的日常安全事件监测过程中,安天CERT经常捕获到大量的MyDoom蠕虫样本和传播该蠕虫的钓鱼邮件。受害主机感染MyDoom后会被放置后门,以便攻击者下发后续恶意软件,进行攻击或窃密等操作。MyDoom蠕虫最早发现于2004年&…

语音质量评价方法之MOS

引言 在语音增强、语音合成、语音转换、声音转换、语音克隆、语音修复等等领域,常常要对输出的语音进行评价。对语音的质量评价一般关注两个方面,即主观评价和客观评价。主观评价就是人凭借听觉感受对语音进行打分,客观评价比较广泛&#xf…

吉林省教育学院学报杂志社吉林省教育学院学报编辑部2024年第5期目录

“研培一体”理论与实践 教师培训管理共同体的职能定位与价值追求 张岩; 1-3 数字化转型背景下教师培训工作的发展路径 李春光; 4-6 挖掘数智潜能,推进教师培训融合创新 鲍赫; 7-9《吉林省教育学院学报》投稿:cn7kantougao163.com 精准培…

网络安全等级保护制度详解,一文掌握核心要点!

一、等级保护制度发展情况 等级保护制度的法律依据 《计算机信息系统安全保护条例》(1994年General Office of the State Council第147号令) 公安部主管全国计算机信息系统安全保护工作。 计算机信息系统实行安全等级保护,安全等级的划分…

夏季河湖防溺水新举措:EasyCVR+AI视频智能监控系统保障水域安全

近日一则新闻引起大众关注,有网友发布视频称,假期在逛西湖时,发现水面上“平躺”漂浮着一名游客在等待救援。在事发3分钟内,沿湖救生员成功将落水游客救到了岸边。 随着夏季的到来,雨水增多,各危险水域水位…

ensp模拟器USG6000V1配置DCHP功能

接着上一篇配置,继续本篇的内容。开启DHCP功能非常简单,只需几个命令即可。实验拓扑图也非常简单,如下: 开启防火墙DHCP功能: [USG6000V1]dhcp enable 选择DHCP接口并设置接口IP地址,这里给g1/0/0配置2网…

Chromium 开发指南2024 Mac篇-编译前的准备工作(一)

1.引言 Chromium 是一款开源的网页浏览器项目,作为 Google Chrome 浏览器的基础,其卓越的性能和广泛的应用使其成为众多开发者研究和学习的对象。对于希望深入了解浏览器内核,或是计划在 Chromium 基础上开发自定义浏览器的开发者来说&#…

【leetcode刷题】面试经典150题 88.合并两个有序数组

leetcode刷题 面试经典150 88. 合并两个有序数组 难度:简单 文章目录 一、题目内容二、自己实现代码2.1 实现思路2.2 实现代码2.3 结果分析 三、 官方解法3.1 直接合并后排序3.1.1 算法实现3.1.2 代码实现3.1.3 代码分析 3.2 双指针3.2.1 算法实现3.2.2 代码实现3.2…

Android ViewModel实现和原理

ViewModel实现和原理 前言1. 使用1.1 gradle准备1.2 模拟场景1.3. LiveData和ViewModel1.4 更新数据 2. 原理与源码解读2.1 添加观察者2.2 setValue2.3 post 参考资料 前言 ViewModel的主要基于观察者的设计模式,他主要分为两个部分: 提供者Provider&a…

Codesys 获取系统年、月、日、时、分、秒、星期几 +解决时区问题+ ST语言编程实现代码

一、 效果如图所示 二、功能说明 发现获取的时间比北京时间多一个时区(8个小时),解决时区问题获取时间后,单独把年月日时分秒提取出来,单独保存在变量中获取星期几,保存在变量中 三、Codesys用ST语言实现…

【MySQL统计函数count详解】

MySQL统计函数count详解 1. count()概述2. count(1)和count(*)和count(列名)的区别3. count(*)的实现方式 1. count()概述 count() 是一个聚合函数,返回指定匹配条件的行数。开发中常用来统计表中数据,全部数据,不为null数据,或…

【C++】模板初级

【C】模板初级 泛型编程函数模板函数模板的概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则 类模板类模板格式类模板的实例化 泛型编程 当我们之前了解过函数重载后可以知道,一个程序可以出现同名函数,但参数类型不同。 //整型 voi…

如何获得一个Oracle 23ai数据库(vagrant box)

准确的说,是Oracle 23ai Free Developer版,因为企业版目前只在云上(OCI和Azure)和ECC上提供。 前面我博客介绍了3种方法: Virtual ApplianceRPM安装Docker 今天介绍最近新出的一种方法,也是我最为推荐的…

如何使用任意浏览器远程访问本地搭建的Jellyfin影音平台

文章目录 前言1. Jellyfin服务网站搭建1.1 Jellyfin下载和安装1.2 Jellyfin网页测试 2.本地网页发布2.1 cpolar的安装和注册2.2 Cpolar云端设置2.3 Cpolar本地设置 3.公网访问测试4. 结语 前言 本文主要分享如何使用Windows电脑本地部署Jellyfin影音服务并结合cpolar内网穿透工…

Linux---系统的初步学习【项目一:Linux操作系统的安装与配置】

项目一 Linux操作系统的安装与配置 1.1 项目知识准备 1.1.1 操作系统是什么? ​ 操作系统(Operating System,OS)是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理硬件、决定程序运行的优先次序、管理文件系统等…

遗传算法浅理解

1. 什么是遗传算法? ​ 遗传算法,又称为 Genetic algorithm(GA)Genetic algorithm(GA)。其主要思想就是模拟生物的遗传与变异。它的用途非常广泛,可以用于加速某些求最大或者最小值的算法(换句话说就是加速算法收敛,最…

月球全月地质图和4.5亿像素月面标注地图

嫦娥六号都在月球挖到土特产了,那你知道月球到底长什么样子吗? 现在我们就为你分享一下月球的全月地质图,以及4.5亿像素月面带标注的地图,你可以在文末查看该数据的领取方法。 月球全月地质图 对于月球的探索,美国和…