Springboot +spring security,使用过滤器方式实现验证码功能

news2025/2/27 0:58:35

一.简介

在前面文章章节通过自定义认证器实现了验证码功能,这篇文章使用过滤器来实现验证码功能。

二.思路分析

实现逻辑和通过过滤器实现json格式登录一样,需要继承UsernamePasswordAuthenticationFilter,所以文档这块主要记录下代码实现,所有代码主要是基于上次实现验证码的项目代码。

三.创建项目

如何创建一个SpringSecurity项目,前面文章已经有说明了,这里就不重复写了。

四.代码实现

4.1创建验证码过滤器

创建验证码过滤器的代码如下:

public class KaptchaFilter extends UsernamePasswordAuthenticationFilter {
    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        String kaptchaCode = (String) request.getSession().getAttribute("KAPTCHA_CODE");
        String inputKaptcha = request.getParameter("kaptcha");
        if (!StrUtil.equals(kaptchaCode, inputKaptcha)) {
            throw new InternalAuthenticationServiceException("验证码验证失败");
        }
        return super.attemptAuthentication(request, response);
    }
}

4.2配置验证码过滤器

配置验证码过滤器的代码如下:

@Bean
    public KaptchaFilter kaptchaFilter(){
        KaptchaFilter kaptchaFilter = new KaptchaFilter();
        kaptchaFilter.setAuthenticationManager(authenticationManager());
        kaptchaFilter.setAuthenticationFailureHandler(new AuthenticationFailureHandler() {
            @Override
            public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
                Map<String,Object> result = new HashMap<>();
                result.put("code",-1);
                result.put("msg","登录失败");
                result.put("data",exception.getMessage());
                writeResp(result,response);
            }
        });
        kaptchaFilter.setAuthenticationSuccessHandler(new AuthenticationSuccessHandler() {
            @Override
            public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
                Map<String,Object> result = new HashMap<>();
                result.put("code",-1);
                result.put("msg","登录成功");
                result.put("data",authentication);
                writeResp(result,response);
            }
        });
        return kaptchaFilter;
    }

4.3配置SecurityFilterChain

配置SecurigyFilterChain的代码如下:

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((auth) ->{
            try {
                auth.antMatchers("/kaptcha").permitAll()
                        .anyRequest().authenticated()
                        .and().formLogin()
                        .loginPage("/login.html")
                        .loginProcessingUrl("/login")
                        .failureForwardUrl("/login.html")
                        .permitAll()
                        .and()
                        .addFilterAt(kaptchaFilter(), UsernamePasswordAuthenticationFilter.class)
                        .csrf().disable();
            }
            catch (Exception e){
            }
        });
        return http.build();
    }

五.验证登录

验证登陆的截图如下:
在这里插入图片描述

在这里插入图片描述

这样就实现了使用过滤器来实现验证码功能了。

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

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

相关文章

每日一题——两数之和(返回下标和返回数值两种情况)

每日一题 两数之和 题目链接 思路 注&#xff1a;本题只采用暴力解法&#xff0c;时间复杂度为O(n2)&#xff0c;如果采用哈希表&#xff0c;可以将时间复杂度降到O(n)&#xff0c;但由于笔者还未对哈希表展开学习&#xff0c;故不做讨论 我们直接用两层for循环来解决问题 第…

安装部署 Mastodon 长毛象去中心化微博系统

注意&#xff1a;本文采用的为 Docker Compose 方式安装部署。 首先选择你安装的版本&#xff0c;有以下两种推荐&#xff1a; 官方版本&#xff1a; https://github.com/mastodon/mastodonGlitch 版本&#xff1a; https://github.com/glitch-soc/mastodon 项目包含一个 Doc…

不同的去耦电容 阻抗VS频率

不同的去耦电容 阻抗VS频率 • 并联电容可以在一个较宽的频带内降低阻抗 • 小的去耦电容尽可能靠近电源引脚 为什么每个电源引脚都需要去耦 去耦电容总结 • 旁路电容离电容引脚尽可能的近 • SMT磁珠对于降低Ripple非常有效 • 高频时需要地平面 – 最小化寄生参数 • 使用…

记两道小明文攻击题

题一 题目描述&#xff1a; flag **************************** flag "asfajgfbiagbwe" p getPrime(2048) q getPrime(2048) m1 bytes_to_long(bytes(flag.encode()))e1e2 3087 n p*q print()flag1 pow(m1,e1,n) flag2 pow(m1,e2,n) print(flag1 str(fla…

MATLAB 搜索某一点的R邻域点 (13)

MATLAB 搜索某一点的R邻域点 (13) 前言一、算法介绍1.1 :无序点云的R邻域点搜索1.2 :有序点云的R邻域点搜索二、具体实现示例2.1 算法一 (含详细注释)2.2 算法二 (含详细注释)前言 在点云处理中,最基本的算法之一就是搜索某一点的近邻点,这在重叠区域确定,点云密度…

Spring Gateway使用JWT实现统一身份认证

在开发集群式或分布式服务时&#xff0c;鉴权是最重要的一步&#xff0c;为了方便对请求统一鉴权&#xff0c;一般都是会放在网关中进行处理。目前非常流行的一种方案是使用JWT&#xff0c;详细的使用说明&#xff0c;可以找相关的资料查阅&#xff0c;这里先不进行深入的引用了…

鲸图知识图谱平台,助力金融业务深度洞察(上)

导语 大数据时代的背景下&#xff0c;数据早就成为数字经济重要的生产资料。对数据的挖掘能力成为企业数字化转型的驱动力。就金融行业来说&#xff0c;如果经营和管理方式跟不上大数据时代的发展脚步就会使得数据价值无法得到充分发挥。知识图谱作为一个结合了知识存储、知识…

SpringCloud入门概述;微服务入门概述

微服务入门概述 入门概述微服务分布式微服务架构Spring Cloud技术栈spring cloud各个组件的使用服务注册服务调用服务降级服务网关服务配置服务总线 参考 入门概述 auther JaneOnly date 2022/11/6 前置课程需要: java8mavengitNginxmqspringboot2.0 微服务 微服务架构就是一…

【阅读笔记】概率预测之DeepAR(含Pytorch代码实现)

本文作为自己阅读论文后的总结和思考&#xff0c;不涉及论文翻译和模型解读&#xff0c;适合大家阅读完论文后交流想法&#xff0c;关于论文翻译可以查看参考文献。论文地址&#xff1a;https://arxiv.org/abs/1704.04110 DeepAR 一. 全文总结二. 研究方法三. 结论四. 创新点五…

软件设计师--考前查漏补缺

软件设计师 上午题一、计算机系统二、操作系统三、数据库技术四、计算机网络五、软件工程概论六、程序设计语言与编译原理七、数据结构与算法八、算法分析与设计九、其他&#xff1a;标准化与知识产权、英语 下午题一、结构化分析设计二、数据库分析技术三、面向对象分析技术四…

代码随想录算法训练营第十四天|二叉树的遍历

这里主要掌握两种遍历方法&#xff1a;递归法和迭代法 递归法&#xff1a; 1、确定递归函数的参数和返回值&#xff0c;这里参数就是节点和用于存放节点数值的vector。 2、确认终止条件&#xff0c;这里的终止条件是节点为空。 3、确定单层递归逻辑&#xff0c;根据前序、中序…

随身WIFI折腾日记(三)---Docker+ssh远程访问+青龙面板

四、安装Docker 安装完Docker以后&#xff0c;我们便可以一键部署一些服务上去了。 sudo curl -fsSL get.docker.com -o get-docker.sh # 下载安装脚本 \&& sudo sh get-docker.sh --mirror Aliyun # 执行安装脚本 \&& sudo systemctl enable docker # 加入开…

一篇文章弄懂卷积神经网络基础概念

文章目录 一篇文章弄懂卷积神经网络基础概念下采样和上采样卷积普通卷积空洞卷积转置卷积膨胀卷积和转置卷积的区别 池化最大池化平均池化 全连接 一篇文章弄懂卷积神经网络基础概念 卷积神经网络可以说是图像处理的天花板&#xff0c;也是当下图像处理在深度学习方面最热门的…

2023/5/23总结

super关键字 super关键字的用法和this 关键字的用法相似 this:代表本类对象的引用&#xff08;this关键字指向调用该方法的对象一般我们是在当前类中使用this关键字&#xff0c;所以我们常说this代表本类对象的引用&#xff09;super:代表父类存储空间的标识(可以理解为父类对象…

AGV/AMR控制器--仙工

AGV/AMR控制器--仙工 1 行业介绍1.1 控制器概念1.2 行业发展1.3 竞争格局 2 仙工控制器 SRC2.1 介绍2.2 优势标准化软硬件&#xff0c;适配多种运动模型超强适配性&#xff0c;适配各大品牌支持车型多样&#xff0c;应对场景复杂灵活应对非标需求 2.3 产品矩阵2.4 实施工具Robo…

CLIP使用教程

文章目录 前言注意使用其他示例 原理篇 前言 本文主要介绍如何调用Hugging Face中openai提供的CLIP API. 注意 如果碰到模型无法自动下载&#xff0c;可手动下载到本地&#xff0c;注意本地调用路径后缀加/。 下载config.json、preprocessor_config.json、pytorch_model.bi…

热乎的过万字GameFramework讲解笔记文档

往期文章分享 点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 本文约15千字&#xff0c;新手阅读需要27分钟&#xff0c;复习需要12分钟 【收藏随时查阅不再迷路】 &#x1f449;关于作者 众所周知&a…

YOLOv5改进系列(5)——替换主干网络之 MobileNetV3

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制 YOLOv5改进系列(2&#

【数据结构与算法篇】栈与队列(详解)附加Leetcode经典笔试题

​&#x1f47b;内容专栏&#xff1a;《数据结构与算法专栏》 &#x1f428;本文概括&#xff1a; 讲述数据结构栈与队列基本知识。 &#x1f43c;本文作者&#xff1a;花 碟 &#x1f438;发布时间&#xff1a;2023.5.23 文章目录 一、栈1.栈的概念及结构2.栈的实现 二、有效的…

C++中的函数模板

目录 1. 什么是函数模板&#xff1f; 2. 如何定义函数模板&#xff1f; 3. 如何使用函数模板&#xff1f; 4. 函数模板与函数重载的区别是什么&#xff1f; 5. 函数模板与类模板有何异同点&#xff1f; 1. 什么是函数模板&#xff1f; - 函数模板是一种通用的函数描述&…