Spring Security实现图形验证码的功能

一、生成图片验证码的步骤
1.根据随机数生成数字
2.将随机数存到Session中
3.将生成的图片写到接口的响应中

public class ImageCode {

    private BufferedImage image;//展示的图片
    private String code;//生成的随机数,Session
    private LocalDateTime expireTime;//过期时间
    public BufferedImage getImage() {
        return image;
    }
    public void setImage(BufferedImage image) {
        this.image = image;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public LocalDateTime getExpireTime() {
        return expireTime;
    }
    public void setExpireTime(LocalDateTime expireTime) {
        this.expireTime = expireTime;
    }

    //是否过期
    public boolean isExpried() {
        return LocalDateTime.now().isAfter(expireTime);
    }

    public ImageCode(BufferedImage image, String code, LocalDateTime expireTime) {
        this.image = image;
        this.code = code;
        this.expireTime = expireTime;
    }

    //多少秒过期(60秒)
    public ImageCode(BufferedImage image, String code, int expireIn) {
        this.image = image;
        this.code = code;
        this.expireTime = LocalDateTime.now().plusSeconds(expireIn);
    }
}
@RestController
public class ValidateCodeController {

    private static final String SESSION_KEY = "SESSION_KEY_IMAGE_CODE";

    //操作Session的类
    private SessionStrategy sessionStrategy = new HttpSessionSessionStrategy();

    @GetMapping("/code/image")
    public void createCode(HttpServletRequest request,HttpServletResponse response) throws IOException {
        //1.根据随机数生成数字
        ImageCode imageCode = createImageCode(request);
        //2.将随机数存到Session中
        //把请求传递进ServletWebRequest,
        sessionStrategy.setAttribute(new ServletWebRequest(request), SESSION_KEY, imageCode);
        //3.将生成的图片写到接口的响应中
        ImageIO.write(imageCode.getImage(), "JPEG", response.getOutputStream());

    }

    //生成图片
    private ImageCode createImageCode(HttpServletRequest request) {
        int width = 67;
        int height = 23;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics graphics = image.getGraphics();
        Random random = new Random();

        graphics.setColor(getRandColor(200,250));
        graphics.fillRect(0, 0, width, height);
        graphics.setFont(new Font("Times New Roman", Font.ITALIC, 20));
        graphics.setColor(getRandColor(160,200));
        for(int i=0;i<155;i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            graphics.drawLine(x, y, x+xl, y+yl);
        }
        String sRand = "";
        for (int i = 0; i < 4; i++) {
            String rand = String.valueOf(random.nextInt(10));
            sRand +=rand;
            graphics.setColor(new Color(20, random.nextInt(110), 20+random.nextInt(110),20+random.nextInt(110)));
            graphics.drawString(rand, 13*i+6, 16);
        }
        graphics.dispose();
        return new ImageCode(image, sRand, 60);
    }

    //随机生成背景条纹
    private Color getRandColor(int fc, int bc) {
        Random random = new Random();
        if (fc>255) {
            fc = 255;
        }
        if (bc>255) {
            bc = 255;
        }
        int r = fc + random.nextInt(bc-fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }
}

前台登录页面增加图形验证码样式

其次,再安全配置类;增加/code/image请求的

.antMatchers("/code/image").permitAll()


二、运行项目

在点击登录按钮之前,需要处理校验码校验的逻辑这一步骤,这个步骤放在UsernamePasswordAuthenticationFilter之前,所以说,在安全配置类里面需求写一个自定义的Filter并且加在Username xx之前

最后启动项目,访问:http://localhost:8080/sign.html


在不输入验证码的时候,点击登录可以看到它把异常栈里面的所有错误信息都打印出来了

这个并不是我们想要的,这个时候需要修改一下失败处理器AuthenticationFailureHandler
把返回所有堆栈信息的方法,改成只返回错误信息。

还有一个问题,就是验证码错误的时候过滤器没有做拦截,而是继续往下走了,这个时候需要更改Filter的方法

启动项目,访问:http://localhost:8080/sign.html
再不输入验证码的时候,点击登录

可以直接看到错误信息

同理,之后继续填写正确的验证码,则可以得到对应的用户信息

输入错误,则有对应错误的消息提示,这个时候 验证码的功能才算是完成了。

原文地址:http://blog.51cto.com/mazongfei/2339927

时间: 2024-10-12 23:52:48

Spring Security实现图形验证码的功能的相关文章

重构Spring Security实现图形验证码的功能

不单要写完功能,而是要把它变的可以配置,供其他的应用可以使用优化要点 验证码的基本参数可配置(宽/高/验证码数字的长度/验证码的有效时间等) 验证码的拦截接口可配置(url地址) 验证码的生成逻辑可配置(更复杂的验证码生成逻辑) 1.验证码的基本参数可配置 在调用方 调用验证码的时候,没有做任何配置,则使用默认的验证码生成规则,如果有则覆盖掉默认配置.默认配置 //生成二维码默认配置 public class ImageCodeProperties { private int width = 6

Spring Security 实现手机验证码登录

思路:参考用户名密码登录过滤器链,重写认证和授权 示例如下(该篇示例以精简为主,演示主要实现功能,全面完整版会在以后的博文中发出): 由于涉及内容较多,建议先复制到本地工程中,然后在细细研究. 1.   新建Maven项目  sms-code-validate 2.   pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchem

Spring Security(十):3. What’s New in Spring Security 4.2 (新功能)

Among other things, Spring Security 4.2 brings early support for Spring Framework 5. You can find the change logs for 4.2.0.M1, 4.2.0.RC1, 4.2.0.RELEASE which closes over 80 issues. The overwhelming majority of these features were contributed by the

spring security实现限制登录次数功能

本节是在基于注解方式进行的,后面的例子都会基于注解形式,不再实现XML配置形式,毕竟注解才是趋势嘛! 关键在于实现自定义的UserDetailsService和AuthenticationProvider 项目结构如下: 查看spring security的源代码可以发现默认security已经定义的user中的一些变量,鉴于此创建users表如下: CREATE TABLE users ( username VARCHAR(45) NOT NULL, password VARCHAR(45)

Spring Security简单实现自定义退出功能

1.前端页面写法 <a href="javascript:;" onclick="logoutBackground()">退出</a> 2.js /** * 退出后台 */ function logoutBackground() { $.get("/admin/logout", function (msg) { if (msg === "true") { window.location.href = &

Spring Security技术栈开发企业级认证与授权

Spring Security技术栈开发企业级认证与授权网盘地址:https://pan.baidu.com/s/1mj8u6JQ 密码: 92rp备用地址(腾讯微云):https://share.weiyun.com/8b2ffc1839069b4399950333860754a4 密码:a539tn 第1章 课程导学介绍课程内容.课程特点,使用的主要技术栈,以及学习课程所需的前置知识 第2章 开始开发安装开发工具,介绍项目代码结构并搭建,基本的依赖和参数设置,开发hello world 第3

Spring Security(十七):5.8 Method Security

From version 2.0 onwards Spring Security has improved support substantially for adding security to your service layer methods. It provides support for JSR-250 annotation security as well as the framework's original @Secured annotation. From 3.0 you c

Spring Security(二十二):6.4 Method Security

From version 2.0 onwards Spring Security has improved support substantially for adding security to your service layer methods. It provides support for JSR-250 annotation security as well as the framework's original @Secured annotation. From 3.0 you c

安全框架Shiro和Spring Security比较

Shiro 首先Shiro较之 Spring Security,Shiro在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势. Shiro是一个强大而灵活的开源安全框架,能够非常清晰的处理认证.授权.管理会话以及密码加密.如下是它所具有的特点: 易于理解的 Java Security API: 简单的身份认证(登录),支持多种数据源(LDAP,JDBC,Kerberos,ActiveDirectory 等): 对角色的简单的签权(访问控制),支持细粒度的签权: 支持一级缓存,以提升应用程序