过滤器Filter,拦截器Interceptor

news2024/12/22 23:55:48
  1. 过滤器Filter
    1. 快速入门

       

    2. 详情
    3. 登录校验-Filter
      1. package com.itheima.filter;
        
        import com.alibaba.fastjson.JSONObject;
        import com.itheima.pojo.Result;
        import com.itheima.utils.JwtUtils;
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.util.StringUtils;
        
        import javax.servlet.*;
        import javax.servlet.annotation.WebFilter;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import java.io.IOException;
        
        /**
         * @author Mr.jia
         * @version 1.0
         */
        @Slf4j
        @WebFilter(urlPatterns = "/*")
        public class LoginCheckFilter implements Filter {
            @Override
            public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                HttpServletRequest req = (HttpServletRequest) servletRequest;
                HttpServletResponse resp = (HttpServletResponse) servletResponse;
                //1.获取请求url
                String url = req.getRequestURI().toString();
                log.info("请求的url:{}",url);
        
                //2.判断请求url中是否包含login,如果包含,说明是登录操作,放行
                if(url.contains("login")){
                    log.info("登录操作,放行...");
                    filterChain.doFilter(servletRequest,servletResponse);
                    return;
                }
                //3.获取请求头中的令牌
                String jwt = req.getHeader("token");
                //4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
                if(!StringUtils.hasLength(jwt)){
                    log.info("请求头token为空,返回登录的信息");
                    Result error = Result.error("NOT_LOGIN");
                    //手动转换  对象---json----->阿里巴巴fastJSON
                    String notLogin = JSONObject.toJSONString(error);
                    resp.getWriter().write(notLogin);
                    return;
        
                }
                //5.解析token,如果解析失败,返回错误结果(未登录)
                try {
                    JwtUtils.parseJWT(jwt);
                } catch (Exception e) {//解析失败
                    e.printStackTrace();
                    log.info("解析令牌失败,返回登录的信息");
                    Result error = Result.error("NOT_LOGIN");
                    //手动转换  对象---json----->阿里巴巴fastJSON
                    String notLogin = JSONObject.toJSONString(error);
                    resp.getWriter().write(notLogin);
                    return;
                }
                //6.放行
                log.info("令牌合法,放行");
                filterChain.doFilter(servletRequest,servletResponse);
            }
        }
        

  2. 拦截器Interceptor
    1. 简介&快速入门
      1. package com.itheima.interceptor;
        
        import org.springframework.stereotype.Component;
        import org.springframework.web.servlet.HandlerInterceptor;
        import org.springframework.web.servlet.ModelAndView;
        
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        
        /**
         * @author Mr.jia
         * @version 1.0
         */
        @Component
        public class LoginCheckInterceptor implements HandlerInterceptor {
            @Override //目标资源方法运行前运行,返回true:放行,false:不放行
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                return true;
            }
        
            @Override //目标资源方法运行后运行
            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");
            }
        }
        

        定义拦截器

      2. package com.itheima.config;
        
        import com.itheima.interceptor.LoginCheckInterceptor;
        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;
        
        /**
         * @author Mr.jia
         * @version 1.0
         */
        @Configuration//配置类
        public class WebConfig implements WebMvcConfigurer {
        
            @Autowired
            private LoginCheckInterceptor loginCheckInterceptor;
        
            @Override
            public void addInterceptors(InterceptorRegistry registry){
                registry.addInterceptor(loginCheckInterceptor).addPathPatterns("/**");
            }
        }
        

        配置拦截器

    2. 详解(拦截路径,执行流程)
    3. 登录校验-Interceptor
      1. /**
         * @author Mr.jia
         * @version 1.0
         */
        @Slf4j
        @Component
        public class LoginCheckInterceptor implements HandlerInterceptor {
            @Override //目标资源方法运行前运行,返回true:放行,false:不放行
            public boolean preHandle(HttpServletRequest servletRequest, HttpServletResponse servletResponse, Object handler) throws Exception {
        
                //1.获取请求url
                String url = servletRequest.getRequestURI().toString();
                log.info("请求的url:{}",url);
        
                //2.判断请求url中是否包含login,如果包含,说明是登录操作,放行
                if(url.contains("login")){
                    log.info("登录操作,放行...");
        
                    return true;
                }
                //3.获取请求头中的令牌
                String jwt = servletRequest.getHeader("token");
                //4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
                if(!StringUtils.hasLength(jwt)){
                    log.info("请求头token为空,返回登录的信息");
                    Result error = Result.error("NOT_LOGIN");
                    //手动转换  对象---json----->阿里巴巴fastJSON
                    String notLogin = JSONObject.toJSONString(error);
                    servletResponse.getWriter().write(notLogin);
                    return false;
        
                }
                //5.解析token,如果解析失败,返回错误结果(未登录)
                try {
                    JwtUtils.parseJWT(jwt);
                } catch (Exception e) {//解析失败
                    e.printStackTrace();
                    log.info("解析令牌失败,返回登录的信息");
                    Result error = Result.error("NOT_LOGIN");
                    //手动转换  对象---json----->阿里巴巴fastJSON
                    String notLogin = JSONObject.toJSONString(error);
                    servletResponse.getWriter().write(notLogin);
                    return false;
                }
                //6.放行
                log.info("令牌合法,放行");
                return true;
            }
        
            @Override //目标资源方法运行后运行
            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");
            }
        }

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

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

相关文章

码住!IC设计常用工具合集!

芯片设计过程中,选择和使用适合的工具是非常重要的。芯片设计工具通常分为三类:EDA工具、模拟仿真工具和布局工具。 一、EDA工具 EDA工具是芯片设计的核心,它包括原理图绘制、逻辑综合、门级仿真工具和物理版图编辑等,可以帮助设计…

Ubuntu 安装 jdk1.8

1 更新软件包 sudo apt update 2 安装jdk1.8 sudo apt install openjdk-8-jdk 3 查看版本 java -version安装成功

自适应滤波方法——LMS算法

自适应滤波器 自适应滤波器:一种能够根据输入信号自动调整自身参数的数字滤波器 非自适应滤波器:具有静态滤波器系统的数字滤波器,静态系数构成了滤波器的传递函数 对于一些应用(如系统辨识、预测、去噪等)&#xff…

固定翼无人机1:500地籍

引言 上几期,睿铂为大家推送了两篇相对精度验证的文章,其优秀的成果引来了业界人士不少的赞叹。同时,许多客户朋友又提出了更高的要求。目前,在地籍精度的项目中,使用多旋翼无人机挂载倾斜摄影相机作业,是能…

机器学习笔记 - 基于TensorFlow Lite的模型部署

一、简述 TensorFlow Lite 是一个移动端库,可用于在移动设备、微控制器和其他边缘设备上部署模型。 假设要执行图像分类任务。首先决定任务的模型。是要创建自定义模型;或者使用预训练模型,如 InceptionNet、MobileNet、NASNetLarge 等。又或者在预训练模型上应用迁…

【问题记录】解决vite多页应用路由改用history之后本地刷新404问题

当前包的版本信息: "vue": "^2.7.14", "vue-router": "^3.6.5" "vite": "^3.0.7", 首先,修改路由模式 首先,将之前多页项目中的某个页面路由模式改用 history ,…

C++服务器框架开发4——日志系统logger/.cpp与.cc

该专栏记录了在学习一个开发项目的过程中遇到的疑惑和问题。 其教学视频见:[C高级教程]从零开始开发服务器框架(sylar) 上一篇:C服务器框架开发3——协程与线程的简单理解/并发与并行 C服务器框架开发4——日志系统logger 目前进度.cpp与.cc 目前进度 …

ByConity与主流开源OLAP引擎(Clickhouse、Doris、Presto)性能对比分析

引言: 随着数据量和数据复杂性的不断增加,越来越多的企业开始使用OLAP(联机分析处理)引擎来处理大规模数据并提供即时分析结果。在选择OLAP引擎时,性能是一个非常重要的因素。 因此,本文将使用TPC-DS基准…

排序算法、HashMap原理以及单例模式

文章目录 1、二分查找2、冒泡排序3、选择排序4、插入排序5、希尔排序6、快速排序(面试写这个)7、ArrayList8、Iterator9、LinkedList10、HashMap10.1、基本数据结构底层数据结构,1.7和1.8有什么不同? 10.2、树化与退化为何要用红黑…

【LINUX】进程间信号

文章目录 前言铺垫信号 信号的产生1、终端按钮产生信号2、调用系统函数向进程发送信号3、软件条件产生信号4、硬件异常产生信号 信号的保存补充:位图数据结构信号的处理结语 前言 铺垫 1、日常中我们能经常感受到信号的存在:红灯停绿灯行、三更鸡鸣、妈…

60.网络训练中的超参调整策略—学习率调整2

4、inverse_time_decay inverse_time_decay(learning_rate, global_step, decay_steps, decay_rate,staircase=False, name=None)逆时衰减,这种方式和指数型类似。如图, 5、cosine_decay cosine_decay(learning_rate, global_step

K8s in Action 阅读笔记——【7】ConfigMaps and Secrets: configuring applications

K8s in Action 阅读笔记——【7】ConfigMaps and Secrets: configuring applications 7.1 Configuring containerized applications 在我们讨论如何将配置数据传递给在Kubernetes中运行的应用程序之前,让我们先看看通常如何配置容器化应用程序。 如果忽略了你可以…

002. java.lang.NumberFormatException: Infinite or NaN,怎么破?

你好,我是YourBatman:当我老了,也写代码;不为别的,只为爱好。 📚前言 如果你工作超5年,100%遇到过这个异常:java.lang.NumberFormatException: Infinite or NaN Infinite中文释义…

使用MockJS进行前端开发中的数据模拟

在前端开发中,有时我们需要在没有后端接口的情况下进行前端页面的开发和测试。这时,我们可以使用MockJS来模拟数据,以便进行开发和调试。MockJS是一个用于生成随机数据和拦截Ajax请求的JavaScript库,它能够帮助我们快速搭建起一个…

InVEST模型

学习目标: 1)采用InVEST模型,掌握产水(包括水源涵养)、碳存储(包括固碳)、土壤保持、水质(氮磷)、生境质量和热岛缓解等生态系统服务评估方法,开展人类活动影响、重大工…

MATLAB EXPO 2023会议记录|基于STM32的MATLAB电机控制方案

算法导出工作流视频:(99 封私信 / 82 条消息) Simulink 算法导出工作流 —— stm32电机控制示例(v2) - 知乎 (zhihu.com) Algorithm-Export Workflows for Custom Hardware 示例: Algorithm-Export Workflows for Custom Hardware - MATLAB & Simuli…

JavaScript拖拽API,ondragstart、ondragover、ondragenter、ondrop,使用详细(JavaScript常用原生拖拽API)

简述:JavaScript的拖拽api相必大家都不陌生,今天来分享下元素在拖动时触发的事件,顺便做下记录。 一、ondragstart事件 ondragstart事件在拖动元素时触发,通常用于设置拖动时的数据类型和数据。可以通过event.dataTransfer.setDa…

开发环境搭建-stm32CubeIDE进行标准库开发

stm32CubeIDE介绍 https://www.stmcu.com.cn/ecosystem/Cube/STM32CubeIDE stm32CubeIDE下载 点击上面的链接,登录即可下载。 搭建demo工程 新建工作空间 创建一个工程 选择芯片-STM32F103C8T6 点击“Next” 点击“Finish ” 添加标准库到项目工程文件目录下 配…

SM国密算法(二)-- OpenSSL库中分离算法

一、OpenSSL简介: OpenSSL 是用于传输层安全性 (TLS) 和安全套接字层 (SSL) 协议的一个强大、商业级和功能齐全的工具包。它也是一个通用的密码学库,包含有RSA、SM4、DES、AES等诸多加密算法。 OpenSSL GitHub地址 二、移植过程 1. 文件目录 下载在…

除蚂蚁文件数据恢复大师之外,还有哪些相似的软件?

数据丢失是一件常见的事情,许多人都会遇到这样的问题。为了解决这个问题,出现了许多数据恢复软件,其中包含蚂蚁文件数据恢复大师。但是,除了蚂蚁文件数据恢复大师之外,还有哪些类似的软件呢?本文为您整理了…