过滤器Filter和拦截器Interceptor实现登录校验

news2024/11/19 1:26:15

一.过滤器

  • Filter过滤器可以把对资源的请求拦截下来,从而实现一些登录验证的功能

1.Filter的快速入门

  • 1.定义Filter:定义一个类,实现Filter接口,并重写其所有方法。
  • 2.配置
public class dofilter implements Filter {
    @Override //初始化只执行一次
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }
    @Override  //拦截操作
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("拦截操作执行");
        //放行前逻辑
        System.out.println("放行前逻辑");
        // 放行 到达下一个filter(如果有)或者执行资源方法
        filterChain.doFilter(servletRequest,servletResponse);
        //获取资源后返回
        System.out.println("获取资源后返回");
    }
    @Override
    public void destroy() {//销毁只执行一次
        Filter.super.destroy();
    }
}

Filter类上加@WebFilter注解,配置拦截资源的路径。

3fbc488fe35b49b9b20be64056d9c209.png

启动类上加@ServletComponentScan开启Servlet组件支持。

74c604eea3964035837966f43ba6bbf7.png

Filter可以根据需求,配置不同的拦截资源路径:

4047693a7f0946deb8b85e58b0a67e37.png

过滤器链

  • 介绍:一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链

优先级是按照过滤器名字首字母顺序

2.JWT和过滤器Filter实现登录校验

  1. 获取请求url
  2. 判断请求url中是否包含login,如果包含,说明是登录操作,放行
  3. 获取请求头中的令牌(token)
  4. 判断令牌是否存在,如果不存在,返回错误结果(未登录)
  5. 解析token,如果解析失败,返回错误结果(未登录)
  6. 放行
package it.com.springbootmybatisprimary.filter;

import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.util.StringUtil;
import it.com.springbootmybatisprimary.pojo.Result;
import it.com.springbootmybatisprimary.utils.AliOSSUtils;
import it.com.springbootmybatisprimary.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import netscape.javascript.JSObject;
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;
@Slf4j
@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("拦截到请求");
        
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String url=request.getRequestURI().toString();//获取请求url
        log.info("url {}",url);
        if(url.contains("login")){//1.url包含login的话放行
            //包含login执行放行操作并return
            log.info("放行");
            filterChain.doFilter(servletRequest,servletResponse);
            return;//获取web资源后直接返回
        }
        //2.获取jwt
        String jwt = request.getHeader("token");
        //3.检查jst令牌不为空
        if(!StringUtils.hasLength(jwt)){//返回错误信息
            Result error = Result.error("NO_LOGIN");
            log.info("jwt令牌不存在");
            //转化为json格式数据 利用fastjson
           String s= JSONObject.toJSONString(error);
             response.getWriter().write(s);
             return;
        }
        //4.检查jwt令牌合法
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析失败 返回报错");
            Result error = Result.error("NO_LOGIN");
            //转化为json格式数据
            String s= JSONObject.toJSONString(error);
            response.getWriter().write(s);
            return;
        }
        //5.放行
        log.info("合法 放行");
        filterChain.doFilter(request,response);
    }
}

Postman测试

1.含有login请求

30f3c7f2e3354beaa8fe2aebc473bc9f.png

2.不含login请求

1593ee30c8d64e58b82bbc03ac42d940.png

9990e00548224d4ea992013e8f4b1146.png

3.请求头包含jwt测试

首先获取JWT令牌

然后emps请求携带JWT令牌测试

e76aad0e4f9e4f2085ed0a5d1c0d7fe6.png

控制台

0772a58385a94d3f8833ab80728f5b50.png

输入错误JWT 校验失败返回报错

87ba63bb1eed498280a72bc80b06e9f2.png

c135beb265dd4eb8bddad401b4700766.png

二.拦截器

什么是拦截器?

是一种动态拦截方法调用的机制,类似于过滤器。
拦截器的作用:

拦截请求,在指定方法调用前后,根据业务需要执行预先设定的代码。

1.拦截器Interceptor入门

1.定义类实现HandleInterceptor接口

5b418176b6944bb89766fbb6c4bda0c0.png

2.定义配置类实现WebMvcConfigurer

0d760dc98b54462d98037458f40f2a77.png

3.postman测试

1.放行的情况

prehandle返回true 表示放行,执行资源方法完毕后,执行posthandle和aftercompletion

cd1e7c17eaac477cb500bc4e4c1113e1.png

e0550411a46145118b5d936317533880.png

2.不放行的情况

prehandle返回false表示不放行一直被拦截

edfb84d92a474be290d8f6e335aeb159.png

d80fd9d9225241bb8fdacffd5fc422b5.png

2.拦截路径

在拦截器中除了可以设置/**拦截所有资源外,还有一些常见拦截路径设置:

拦截路径

含义

举例

/*

一级路径

能匹配/depts,/emps,/login,不能匹配 /depts/1

/**

任意级路径

能匹配/depts,/depts/1,/depts/1/2

/depts/*

/depts下的一级路径

能匹配/depts/1,不能匹配/depts/1/2,/depts

/depts/**

/depts下的任意级路径

能匹配/depts,/depts/1,/depts/1/2,不能匹配/emps/1

 

  • 在controller当中的方法执行完毕之后,再回过来执行

postHandle()这个方法以及afterCompletion() 方法,然后再返回给DispatcherServlet,最终再来执行过滤器当中放行后的这一部分逻辑的逻辑。执行完毕之后,最终给浏览器响应数据。

3.拦截器与过滤器执行时机

  • 当我们打开浏览器来访问部署在web服务器当中的web应用时,此时我们所定义的过滤器会拦截到这次请求。拦截到这次请求之后,它会先执行放行前的逻辑,然后再执行放行操作。而由于我们当前是基于springboot开发的,所以放行之后是进入到了spring的环境当中,也就是要来访问我们所定义的controller当中的接口方法。
  • Tomcat并不识别所编写的Controller程序,但是它识别Servlet程序,所以在Spring的Web环境中提供了一个非常核心的Servlet:DispatcherServlet(前端控制器),所有请求都会先进行到DispatcherServlet,再将请求转给Controller。
  • 当我们定义了拦截器后,会在执行Controller的方法之前,请求被拦截器拦截住。执行

e30070a0ebd54260a2eb9fefdf3a36b0.png

拦截器与过滤器的区别:

  • 接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
  • 拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只会拦截Spring环境中的资源。

postman测试控制台输出日志

c7579243a4984ba9b58f14917f9715f5.png

2.拦截器InterCeptor实现登录校验功能

在放行前进行登录校验所以在prehandle函数进行

与过滤器实现登录校验逻辑一致,直接复制修改一下

放行操作改为return true 不放行操作改为return false

类型就是Http类型不用强转

@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("执行preHandle");//访问资源前执行 return true表示放行 false表示拦截
      /*  System.out.println("filter拦截到请求");*/

        //强转 能够调HttpServletRequest和HttpServletResponse接口中特有的方法和属性,这些方法和属性在更通用的
        //ServletRequest和ServletResponse接口中并不存在。例如要获取请求的URL/getRequestURI())、查询参数(
        //getParameter())、请求头(getHeader())等
        String url = request.getRequestURI().toString();//获取请求url
        log.info("url {}", url);
        if (url.contains("login")) {//1.url包含login的话放行
            //包含login执行放行操作并return
         /*   log.info("filter放行");*/
           return true;
           /* System.out.println("filter放行后");*/

        }
        //2.获取请求jwt
        String jwt = request.getHeader("token");//获取token携带的jwt
        //3.检查jst令牌不为空
        if (!StringUtils.hasLength(jwt)) {//返回错误信息
            Result error = Result.error("NO_LOGIN");
            log.info("jwt令牌不存在");
            //转化为json格式数据 利用fastjson
            String s = JSONObject.toJSONString(error);
            response.getWriter().write(s);
            return true;
        }
        //4.检查jwt令牌合法
        try {
            JwtUtils.parseJWT(jwt);
        } catch (Exception e) {
            e.printStackTrace();
            log.info("解析失败 返回报错");
            Result error = Result.error("NO_LOGIN");
            //转化为json格式数据
            String s = JSONObject.toJSONString(error);
            response.getWriter().write(s);//写入响应体(getWriter().write())
            return false;
        }
        //5.放行
        log.info("合法 放行");
        /*filterChain.doFilter(request, response);//继续过滤器链*/
        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");//视图渲染后执行
    }
}

postman测试

58ec3c64953a430195bde99fa35e16e0.png

aa078093c4be4b69b85e89945d14c469.png

 

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

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

相关文章

IT技术产品:开发者极为重要的思维习惯

1、特色内容预告 1、我用敏捷开发思维,提高工作效率。 2、我用代码批判思维,逐渐让自己的作品变得无可挑剔。 3、我是一个顶级程序员,是哪些重要的专业习惯,让我如此优秀? 2、可以免费获取到的IT资源 1、《软件工程&a…

深度学习入门到放弃系列 - 阿里云人工智能平台PAI部署开源大模型chatglm3

通过深度学习入门到放弃系列 - 魔搭社区完成开源大模型部署调用 ,大概掌握了开源模型的部署调用,但是魔搭社区有一个弊端,关闭实例后数据基本上就丢了,本地的电脑无法满足大模型的配置,就需要去租用一些高性价比的GPU机…

地平线X3开发板Intel Realsense深度相机调试记录

1. 预编译包 编译这个SDK花费了5.6个小时,为了方便各位后续使用, 各位可以直接下载编译好的文件,包含C和Python的库,相关文件已经上传至百度云(提取码:awe4 )。 在提供的这些文件中&#xf…

【教程】Linux/Jetson 安装X11VNC同步屏幕内容

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,请不吝给个[点赞、收藏、关注]哦~ 目录 背景说明 实际效果 安装步骤 安装 x11vnc 配置 x11vnc 配置 x11vnc 作为系统服务 使用 VNC 客户端连接 背景说明 通常vnc-server是单…

基于Java的俄罗斯方块游戏的设计与实现

关于俄罗斯方块项目源码.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89300281 基于Java的俄罗斯方块游戏的设计与实现 摘 要 俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑、手机、掌上游戏机产品,是一款游戏规则简单…

[MRCTF2020]PixelShooter

是个安卓游戏题 re手肯定不会去玩游戏,先jadx分析一波 没有什么关键信息,但找到了一个unity类,想到apk也可以解压缩得到 .so 或者 Assembly-CSharp.dll 故又在dnspy分析一下 看了半天没有和flag有关信息,看wp: Asse…

用友网络的危与机:2023年亏损约10亿元,王文京面临严肃拷问

“企业在新的产业浪潮来临时,应该主动推进新阶段的产品和业务创新,这样才能够在新的浪潮成为主流的时候,走到行业前面,否则就会从产业发展的潮流中掉下来”。用友网络创始人王文京,曾用“冲浪理论”形容一家企业成功的…

单区域OSPF实验

实验目的: 理解OSPF的基本概念。掌握单曲于OSPF的配置掌握OSPF邻居状态的解读掌握通过Cost控制OSPF选路的方法掌握OSPF认证的配置方法 一、基础配置: 搭建实验拓扑图; 配置路由器接口的IP地址以及配置环回地址待后续使用 (1&a…

ICode国际青少年编程竞赛- Python-6级训练场-多重递归

ICode国际青少年编程竞赛- Python-6级训练场-多重递归 1、 def move(a, b):if a > 12:returnDev.step(a)Dev.turnRight()if b < 4:move(a, b1)else:move(a2, 1) move(2, 1)2、 def move(a, b):if a < 2:returnif b 1: Spaceship.step(2)Dev.step(a)Dev.turnRight()De…

leetcode.K站中转(python)

开始准备用dfs深度搜索&#xff0c;发现n100&#xff0c;dfs可能会超时&#xff0c;即使用了剪枝。 class Solution:def findCheapestPrice(self, n: int, flights: List[List[int]], src: int, dst: int, k: int) -> int:length k 2ans float(inf)rec []vis [True]*n…

idea2023.3.2版本全局设置maven地址

idea每次新建项目都默认使用了一个user目录下的地址&#xff0c;而不是自己安装的maven地址&#xff0c;每次创建项目后&#xff0c;都要重新从settings中设置一下maven地址。 可以全局修改&#xff1a;首先在File-->Close Project回到idea最开始的界面 然后在Customize里点…

重写muduo网络库之调用流程的梳理

目录 1、流程叙述 2、我们看看TcpServer的构造都做了什么&#xff1f; 3、start() 3.1 开启loop 3.2 连接的建立 3.3 数据的收发 4、连接的关闭 muduo网络库各组件梳理见此博客 重写muduo库之组件梳理 1、流程叙述 首先&#xff0c;我们是怎么使用的&#xff1f; 1.定…

每日一学—K邻算法:在风险传导中的创新应用与实践价值

文章目录 &#x1f4cb; 前言&#x1f3af; K邻算法的实践意义&#x1f3af; 创新应用与案例分析&#x1f525; 参与方式 &#x1f4cb; 前言 在当今工业领域&#xff0c;图思维方式与图数据技术的应用日益广泛&#xff0c;成为图数据探索、挖掘与应用的坚实基础。本文旨在分享…

番外篇 | 手把手教你利用YOLOv8进行热力图可视化 | 针对视频

前言:Hello大家好,我是小哥谈。YOLOv8的热力图可视化可以帮助我们更加直观地了解模型在图像中的检测情况,同时也可以帮助我们进行模型的调试和优化。热力图是一种颜色渐变的图像,不同颜色的区域表示不同程度的关注度或者置信度。在YOLOv8中,可以通过设置阈值来控制热力图的…

关键字详解

1.用于定义访问权限修饰符的关键字 面向对象程序三大特性&#xff1a;封装、继承、多态。 1.1 访问权限符 Java 中主要通过类和访问权限来实现封装&#xff1a; 类可以将数据以及封装数据的方法结合在一起 &#xff0c;更符合人类对事物的认知&#xff0c;而访问权限用来控制…

怎样计算Excel一列数值中十位数为5的个数?

有一列数字&#xff0c;可能正数也可能是负数&#xff0c;有可能有小数&#xff0c;要怎么计算这列数字中十位数为5的数量有多少个&#xff1f; 一、按示例情况&#xff0c;数字均为整数 公式如下&#xff1a; SUM(--(MID(A1:A6,LEN(A1:A6)-1,1)"5")) 数组公式&a…

python的文件操作及函数式编程介绍

五、文件操作 1、读取键盘输入 input 获取标准输入&#xff0c;数据类型统一为字符串 #!/usr/bin/python # -*- coding: UTF-8 -*- str input("请输入&#xff1a;") print&#xff08;"你输入的内容是: ", str&#xff09; 这会产生如下的对应着输入的…

解锁客户需求密码:银行业数据分析在业务决策中的关键作用

一、引言 在数字化和大数据时代的浪潮下&#xff0c;银行业正经历着前所未有的变革。作为数据分析领域的资深专家&#xff0c;我深知数据分析在银行业务发展中的重要性和价值。本文将从银行业数据分析的角度出发&#xff0c;深入探讨相关业务场景下的数据分析应用&#xff0c;…

基于spingboot,vue线上辅导班系统

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 权限划分&#xff1a;用户&#xff0c;管理员 具有前后台展示&#xff0c;前台供用户使用&#xff1b;用户具有自己的后台&#xff0c;查看自己的老师课程等&#xff1b;管理员具有最大的权限后台。 用户&#xff1a…

Linux 第二十九章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…