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

一.简介

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

二.思路分析

实现逻辑和通过过滤器实现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();
    }

五.验证登录

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

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UNIX网络编程卷一 学习笔记 第十六章 非阻塞式IO

套接字的默认状态是阻塞的&#xff0c;当发出一个不能立即完成的套接字调用时&#xff0c;进程将被投入睡眠&#xff0c;等待相应操作完成。可能阻塞的套接字调用有以下四类&#xff1a; 1.输入操作&#xff1a;包括read、readv、recv、recvfrom、recvmsg函数。如果进程对一个阻…

java版企业工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

嵌入式学习之Linux驱动(第九期_设备模型_教程更新了)_基于RK3568

驱动视频全新升级&#xff0c;并持续更新~更全&#xff0c;思路更科学&#xff0c;入门更简单。 迅为基于iTOP-RK3568开发板进行讲解&#xff0c;本次更新内容为第九期&#xff0c;主要讲解设备模型&#xff0c;共计29讲。视频选集 0.课程规划 06:35 1.抛砖引玉-设备模型…

vue 3.0使用 iframe 标签引入本地HTML页面,并实现数据交互

文章目录 1. 问题总结2. vue中引入html页面3. vue向html传递数据4. html向vue传递数据 1. 问题总结 最近在做vue的项目时候&#xff0c;需要引入本地html页面&#xff0c;中间遇到了很多问题&#xff0c;费时又费力&#xff0c;因此记录下来&#xff0c;以备不时之需&#xff…

win10微软Edge浏览器通过WeTab新标签页免费无限制使用ChatGPT的方法,操作简单,使用方便

目录 一、使用效果 二、注册使用教程 1.打开Edge浏览器扩展 2.选择Edge浏览器外接程序 3.搜索WeTab 4.进入管理扩展 5.启用扩展 ​编辑 6.进入WeTab新标签页 7.打开Chat AI 8.注册 9.使用 ChatGPT是OpenAI推出的人工智能语言模型&#xff0c;能够通过理解和学习人类…

多线性开发实例分享

一. 概述 首先&#xff0c;在这里有必要和大家复现一下我使用该技术的背景&#xff1a; 在使用若依框架的时候&#xff0c;由于实际开发的需要&#xff0c;我需要配置四个数据源&#xff0c;并且通过mapper轮流去查每个库的指定用户数据&#xff0c;从而去判断改库是否存在目标…

PyQt5实现父窗口内点击按钮显示子窗口(窗口嵌套功能)

摘要&#xff1a;在软件中&#xff0c;常会有点击某个按钮&#xff0c;显示一个新的子界面的需求&#xff0c;本文介绍如何在PyQt5中实现这一功能&#xff0c;主要涉及知识点是“信号与槽函数的自动绑定”。 程序说明&#xff1a; 1.开发环境&#xff1a;win10系统&#xff0c…

如何在 Linux 中创建非登录用户?

在 Linux 系统中&#xff0c;用户账户的管理是一个重要的任务。除了常规的登录用户&#xff0c;有时候我们需要创建一些非登录用户&#xff0c;这些用户通常用于运行服务、执行特定任务或限制访问权限。 本文将详细介绍如何在 Linux 中创建非登录用户&#xff0c;并提供一些相关…

基于Redis的Java分布式锁,接口并发处理,并发方案

Redis的分布式锁很多人都知道&#xff0c;比如使用Jedis的setNx、incr等方法都可以实现分布式锁的功能&#xff0c;但是Jedis需要自己管理连接池&#xff0c;就稍微麻烦一点。 今天介绍的是使用RedisTemplate切面编程自定义注解SPEL来实现分布式锁的功能&#xff0c;封装完成后…

(电脑硬件)台式机主板音频端口功能详解

当你想给你的主机插上音响或者耳机时&#xff0c;你会发现主板上有6个接口&#xff0c;同样都是3.5mm接口&#xff0c;你知道该插哪个吗&#xff1f; 一般情况下&#xff0c;后置输入输出端口面板中&#xff0c;大多数的主板音频部分是彩色的。这一类颜色跟功能基本是固定的。当…

代码随想录训练营Day53| 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划

目录 学习目标 学习内容 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划 学习目标 1143.最长公共子序列 1035.不相交的线 53. 最大子序和 动态规划 学习内容 1143.最长公共子序列 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09;ht…

通过ChatGPT跟MetaHuman对话,Android/iOS兼容

一、申请ChatGPT的API-KEY 1.通过 openAI官网申请API-KEY 2.参考使用腾讯云函数一分钟搭建 OpenAI 免翻墙代理搭建openAI免翻墙代理 3.通过Postman测试一下openAI函数是否可被调用,传入BearerToken和Body参数,ChatGPT即可返回应答数据 二、启用必要的插件 1.启用文字转语…

文本三剑客-Sed

sed工作原理 sed的特点&#xff1a; sed基本语法 模式空间中的编辑操作---地址定界 常用编辑命令 增添&#xff08;a&#xff09; 追加&#xff08;i&#xff09; 删除&#xff08;d&#xff09; 读入文件&#xff08;r&#xff09; 固定长度替换&#xff08;y&#xff0…

Segment Anything专题论文和代码汇总

文章目录 2023Scaling-up Remote Sensing Segmentation Dataset with Segment Anything ModelPersonalize Segment Anything Model with One ShotSegment Anything in Medical ImagesMatcher: Segment Anything with One Shot Using All-Purpose Feature MatchingCustomized Se…

程序员困局:去大城市进大厂却买不了房,回老家又没有高薪工作…

对于在外打拼的程序员来说&#xff0c;难的是进大厂&#xff0c;而不是买不起房。 进大厂的程序员&#xff0c;能不能买得起房&#xff1f; 进大厂的程序员的薪资&#xff0c;还是相当可观的。以阿里P6为例&#xff0c;年薪50万&#xff0c;到手40万左右&#xff0c;刨去10万…

C++小知识点(auto关键字)

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

5月跳槽会有风险,不跳也会有?

今天讲讲跳槽。 说实话跳槽是为了寻求更好的发展&#xff0c;但在跳槽前我们也不能确定下家就是更好的归宿&#xff0c;这就更加需要我们审慎地去对待&#xff0c;不能盲目跳槽。 其次&#xff0c;我们离职和跳槽&#xff0c;其中的原因很大一部分是目前薪资不符合预期。 那…

【面试篇】SpringIoC、AOP、MVC面试实战

version&#xff1a;1.0 文章目录 SpringSpring基础 / IoC&#x1f64e;‍♂️面试官&#xff1a;举例Spring的模块&#xff1f;&#x1f64e;‍♂️面试官&#xff1a;Spring、SpringMVC、Spring Boot关系&#xff1f;&#x1f64e;‍♂️面试官&#xff1a;说说对SpringIoC的…

人工智能值不值得学习?人工智能就业方向及前景

人工智能值不值得学习? 一、人工智能值得学吗&#xff1f; 很多同学想要知道人工智能值得学吗&#xff1f;小编认为是值得的&#xff0c;具体原因有以下两点&#xff1a; 1、人工智能专业前景好&#xff0c;但人才紧缺 根据人工智能行业的专家预计&#xff0c;到2020年&am…

探索【Stable-Diffusion WEBUI】的图片超分辨插件:StableSR

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;图片放大&#xff08;二&#xff09;图片超分辨率放大脚本插件&#xff08;StableSR&#xff09;&#xff08;2.1&#xff09;下载组件&#xff08;2.2&#xff09;使用&#xff08;2.3&#xff09;实例对比…