SpringBoot的Filter过滤器结合JWT实现登录验证

news2025/1/22 16:04:51

概念:Filter 过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。

过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。

过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。

 快速入门

 定义FIlter类   

@WebFilter(urlPatterns = "/*")
public class TestFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化方法");
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("放行前执行的逻辑");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("放行后执行的逻辑");
    }

    @Override
    public void destroy() {
        System.out.println("销毁方法执行的逻辑");
        Filter.super.destroy();
    }
}

 配置Filter

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

引导类上加 @ServletComponentScan 开启Servlet组件支

@SpringBootApplication
@ServletComponentScan
public class WebManagementApplication {

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

}

Filter拦截路径

拦截具体路径

/login

只有访问 /login 路径时,才会被拦截

目录拦截

/emps/*

访问/emps下的所有资源,都会被拦截

拦截所有

/*

访问所有资源,都会被拦截

Filter的执行流程:请求 --> 放行前逻辑 --> 放行 --> 资源 --> 放行后逻辑

过滤器链: 一个web应用中,配置了多个过滤器,就形成了一个过滤器链

登录验证Filter流程

  • 获取请求url。
  • 判断请求url中是否包含login,如果包含,说明是登录操作,放行。
  • 获取请求头中的令牌(token)。
  • 判断令牌是否存在,如果不存在,返回错误结果(未登录)。
  • 解析token,如果解析失败,返回错误结果(未登录)
  • 放行

 Filter类

@Slf4j
@WebFilter(urlPatterns = "/*")
public class TestFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        httpServletResponse.setCharacterEncoding("UTF-8");
        //获取url
        String url = httpServletRequest.getRequestURI();
        log.info("url:{}",url);
        //判断是否包含login请求,是就放行
        if (url.contains("login")) {
            filterChain.doFilter(request,response);
            return;
        }
        //获取token
        String token = httpServletRequest.getHeader("token");
        //判断token是否存在
        if (!StringUtils.hasLength(token)) {
            Result error = Result.error("未登录");
            String noLogin = JSONObject.toJSONString(error);
            httpServletResponse.getWriter().write(noLogin);
            return;
        }
        //解析token是否存在
        try {
            JwtUtils.parseJwt(token);
        }catch (Exception e){
            e.printStackTrace();
            Result noLogin = Result.error("未登录");
            String s = JSONObject.toJSONString(noLogin);
            httpServletResponse.getWriter().write(s);
            return;
        }
        log.info("令牌合法,放行:{}",token);
        filterChain.doFilter(request,response);
    }
}

 JwtUtils类

 

@Component
public class JwtUtils {
    private static final String SIGN_KEY = "laohuang";
    //生成
    public static String generateJwt(Map<String,Object> claims){
        return Jwts.builder()
                .setClaims(claims) //自定义内容
                .signWith(SignatureAlgorithm.HS256, SIGN_KEY)//签名算法
                .setExpiration(new Date(System.currentTimeMillis() + 12 * 3600)) //有效期
                .compact();
    }
    //解析
    public static Claims parseJwt(String token){
        return Jwts.parser()
                .setSigningKey(SIGN_KEY)
                .parseClaimsJws(token)
                .getBody();
    }
}

结果

 

 

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

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

相关文章

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题27移除元素) 2023.4.18

目录 前言算法题&#xff08;LeetCode 27.移除元素&#xff09;—&#xff08;保姆级别讲解&#xff09;分析题目算法思想&#xff08;重要&#xff09;暴力解法代码&#xff1a;双指针法&#xff08;快慢指针法&#xff09;代码&#xff1a;反思 结束语 前言 本文章一部分内容…

UDP - C/S模型

由于UDP不需要维护连接&#xff0c;程序逻辑简单了很多&#xff0c;但是UDP协议是不可靠的&#xff0c;保证通讯可靠性的机制需要在应用层实现。 通信函数 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen); 参…

无人机动力系统优化测试平台-15kg级-Flight Stand 15

产品简介 通过Flight Stand 15测试台对电机和螺旋桨的拉力&#xff0c;扭矩&#xff0c;转速&#xff0c;电流&#xff0c;电压&#xff0c;温度&#xff0c;空速&#xff0c;螺旋桨效率和电机效率的测量帮助您精准地描述和评估其性能参数&#xff0c;这是我们五年多来的无人机…

[JAVASE]初识Java:数据类型与变量

CSDN的各位友友们你们好,今天千泽为大家带来的是 [JAVASE]初识Java&#xff1a;数据类型与变量、运算符, 接下来让我们一起了解一下吧! 如果对您有帮助的话希望能够得到您的支持和关注,我会持续更新 数据类型与变量 数据类型 在Java中数据类型分为基本数据类型与引用数据类…

15.2 矩阵链乘法

1.代码 public class MatrixChainMultiplication {public static void main(String[] args) { // 在该代码中&#xff0c;我们首先创建了两个n * n的矩阵m和s&#xff0c;分别用于记录最优值和分割点。 其中m 矩阵 通过i j 来显示在i到j的矩阵链中最优解 // // …

JavaSE/异常

博客制作不易&#xff0c;欢迎各位点赞&#x1f44d;收藏⭐关注 前言 在使用Java编写代码时&#xff0c;我们难免会遇到数组越界、运行超时、栈溢出等异常问题。所以如果我们熟练掌握异常的定义和使用&#xff0c;这对我们学习Java有很大的帮助。 一、异常的定义 程序执行过程…

图书馆管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87682509 更多系统资源库…

计算机视觉的热门研究方向与发展趋势

计算机视觉产业链 工业界&#xff1a;对学术研究提出需求 最火的两个概念&#xff1a;自动驾驶和元宇宙 相关热点研究方向&#xff1a; &#xff08;1&#xff09;建图技术&#xff1a;三维重建技术&#xff0c;包括SLAM、定位、建图、更新等技术&#xff1b;&#xff08;2&…

学习机器人SLAM导航核心技术(一)

本章节&#xff0c;我们将学习基于SLAM导航的机器人技术。 学习资料主要参照张虎的《机器人SLAM导航核心技术与实战》和高翔的《视觉SLAM十四讲》。 以机器人SLAM导航核心技术与实战作为学习的技术路线。在此基础上增加自己学习到的内容。 第1章&#xff1a;ROS入门必备知识 …

Git介绍与相关操作

git简介 git是用于版本控制的软件&#xff0c;保留历史记录&#xff0c;便于回溯 GitHub中文官方文档 访问GitHub GitHub520 无法访问GitHub太常见了&#xff0c;主要方法就是查ip&#xff0c;改本地host文件。 GitHub520本质也是修改hosts来实现&#xff0c;但是无需手动查…

Pycharm Debug调试技巧

Pycharm Debug调试 Python中的Bug是指程序在执行过程中出现错误的情况。这些错误可能会导致程序崩溃、输出意外的结果或者根本不运行。 常见的Python Bug包括&#xff1a; 语法错误&#xff1a;例如拼写错误、缺少冒号、使用了错误的缩进等等。逻辑错误&#xff1a;程序可以…

草图大师su通过照片建模建筑 零插件sketchup

打开sketchup&#xff0c;相机-匹配新照片。照片的要求&#xff1a; “匹配照片”最适合主要由直角组成的结构。您肯定至少需要一个直角才能使用匹配照片。使用从角落以大约 45 度角拍摄的照片。上图来自谷歌街景图是以 45 度角拍摄的图像示例。如果您正在拍照&#xff0c;则可…

模糊数学求传递闭包(C语言)

一、问题描述 我们在模糊数学中利用传递闭包法进行聚类分析的时候&#xff0c;需要求模糊相似矩阵的传递闭包&#xff0c;对于阶数比较高的矩阵&#xff0c;手工计算太过于繁琐&#xff0c;我们可以借助程序实现。 我们先来看一下模糊矩阵的合成规则&#xff1a; 设为有限论域…

ChatGPT能取代传统伪原创工具吗?

文章伪原创工具是一种计算机辅助写作工具&#xff0c;通过算法和技术实现对原有文章内容进行修改和改写&#xff0c;生成新的、看起来不同于原文的文章&#xff0c;以达到避免抄袭和提高原创性的目的。今天我们来聊聊传统伪原创工具和使用ChatGPT进行文章改写的优缺点。 一、传…

【状态估计】电力系统状态估计的虚假数据注入攻击建模与对策(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C++ Linux Web Server 面试基础篇-操作系统(一、Linux基础)

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

SpringBoot访问静态资源和jar外部静态资源,部署前端打包后的vue项目放入静态资源里

记录一下使用SpringBoot访问静态资源和SpringBoot打包之后的jar外部静态资源&#xff0c;在开发的时候&#xff0c;一般选择前后端分离的方式&#xff0c;前端使用vue 后端使用SpringBoot&#xff0c;通常情况下&#xff0c;部署都是前端通过http去请求后端资源&#xff0c;涉及…

CVE-2021-27905 Apache Solr SSRF漏洞

预备知识 1. 漏洞信息 漏洞编号&#xff1a;CVE-2021-27905 漏洞名称&#xff1a;Apache Solr SSRF漏洞 漏洞描述&#xff1a;Apache Solr是一个开源的搜索服务&#xff0c;使用Java编写、运行在Servlet容器的一个独立的全文搜索服务器&#xff0c;是Apache Lucene项目的开源…

在Claude穿越千年,问了孔子人生问题

&#x1f4d5;如果大家还不知道Claude的话&#xff0c;可以先了解下&#xff0c;它是chatgpt最大的竞争对手。他有很多的知识&#xff0c;能做的事情也非常的多。 今天我们就让他用孔子的思想来跟我们对话&#xff0c;看看他会怎么回答我们的人生问题。 我们先问问他&#xf…

组播协议的RP

某组播网络示意图如图,其中MCS1是组播地址(G1)的组播源,PC1和PC2是组G1的接收者。 1.上述组播网络中,端口1、2、3需要运行哪些协议,为什么需要运行这些协议?(仅填必配的组播协议)详细写出具体原因 结合上述拓扑,考虑到存在RP场景,因此运行组播路由协议为PIM-SM协议,…