Sping Security框架下java代码实现Google验证码

添加项目依赖

<!-- google kaptcha验证码 -->
<dependency>
    <groupId>com.github.axet</groupId>
    <artifactId>kaptcha</artifactId>
    <version>0.0.9</version>
</dependency>

谷歌验证码配置类

package com.xxxx.server.config;

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Properties;

/**
 * 谷歌验证码配置类
 *
 * @Author : liuchang
 * @Date : 2021/5/13 17:06
 * @Version 1.0
 */
@Configuration
public class CaptchaConfig {
    
    

    @Bean
    public DefaultKaptcha getDefaultKaptcha() {
    
    
        // 验证码生成器
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        // 配置
        Properties properties = new Properties();
        // 是否有边框
        properties.setProperty("kaptcha.border", "yes");
        // 设置边框颜色
        properties.setProperty("kaptcha.border.color", "105,179,90");
        // 边框粗细度,默认为1
        // properties.setProperty("kaptcha.border.thickness","1");
        // 验证码
        properties.setProperty("kaptcha.session.key", "code");
        // 验证码文本字符颜色 默认为黑色
        properties.setProperty("kaptcha.textproducer.font.color", "blue");
        // 设置字体样式
        properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
        // 字体大小,默认40
        properties.setProperty("kaptcha.textproducer.font.size", "30");
        // 验证码文本字符内容范围 默认为abced2345678gfynmnpwx
        //properties.setProperty("kaptcha.textproducer.char.string", "");
        // 字符长度,默认为5
        properties.setProperty("kaptcha.textproducer.char.length", "4");
        // 字符间距 默认为2
        properties.setProperty("kaptcha.textproducer.char.space", "4");
        // 验证码图片宽度 默认为200
        properties.setProperty("kaptcha.image.width", "100");
        // 验证码图片高度 默认为40
        properties.setProperty("kaptcha.image.height", "40");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

提供验证码生成接口

package com.xxxx.server.controller;

import com.google.code.kaptcha.impl.DefaultKaptcha;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
 * 验证码
 *
 * @Author : liuchang
 * @Date : 2021/5/13 17:22
 * @Version 1.0
 */
@RestController
public class CaptchaController {
    
    

    @Autowired
    private DefaultKaptcha defaultKaptcha;

    @ApiOperation(value = "验证码")
        @GetMapping(value = "/captcha", produces = "image/jpg")
    public void captcha(HttpServletRequest request, HttpServletResponse response) {
    
    
        // 定义response输出类型为image/jpeg类型
        response.setDateHeader("Expires", 0);
        // Set standard HTTP/1.1 no-cache headers.
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        // Set IE extended HTTP/1.1 no-cache headers (use addHeader).
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        // Set standard HTTP/1.0 no-cache header.
        response.setHeader("Pragma", "no-cache");
        // return a jpeg
        response.setContentType("image/jpeg");

        //-------------------生成验证码 begin --------------------------
        // 获取验证码文本内容
        String text = defaultKaptcha.createText();
        System.out.println("验证码内容:" + text);
        //将验证码放入session中
        request.getSession().setAttribute("captcha", text);
        //根据文本内容创建图形验证码
        BufferedImage image = defaultKaptcha.createImage(text);
        ServletOutputStream outputStream = null;
        try {
    
    
            outputStream = response.getOutputStream();
            //输出流输出图片,格式jpg
            ImageIO.write(image, "jpg", outputStream);
            outputStream.flush();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            if (null != outputStream) {
    
    
                try {
    
    
                    outputStream.close();
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }
        //-------------------生成验证码 end ----------------------------
    }
}

在security框架中放行

    @Override
    public void configure(WebSecurity web) throws Exception {
    
    
        web.ignoring().antMatchers(
                "/login",
                "/logout",
                "/css/**",
                "/js/**",
                "/index.html",
                "/img/**",
                "/captcha",
                "/webjars/**",
                "/swagger-resources/**",
                "/favicon.ico",
                "/v2/api-docs/**",
                "/doc.html",
                "v2/api-docs/**"
        );
    }

校验验证码

登录参数对象验证码属性

实体类中pojo,新增验证属性

package com.xxxx.server.pojo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * @Author : liuchang
 * @Date : 2021/5/12 13:57
 * @Version 1.0
 * @Description DOTO
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "AdminLogin对象", description = "")
public class AdminLoginParam {
    
    
    @ApiModelProperty(value = "用户名", required = true)
    private String username;
    @ApiModelProperty(value = "密码", required = true)
    private String password;
    @ApiModelProperty(value = "验证码", required = true)
    private String code;
}

登陆方法添加验证码判断

LoginController.java(添加验证码参数)

    @ApiOperation(value = "登陆之后返回token")
    @PostMapping("/login")
    public ReapBean login(@RequestBody AdminLoginParam adminLoginParam, HttpServletRequest request) {
    
    
        return adminService.login(adminLoginParam.getUsername(), adminLoginParam.getPassword(), adminLoginParam.getCode(), request);
    }

AdminServiceImpl.java

// 前端传过来用户名和密码和请求信息
public ReapBean login(String username, String password, String code, HttpServletRequest request) {
    
    
    String captcha = (String) request.getSession().getAttribute("captcha");
    if (StringUtils.isEmpty(code)||!captcha.equalsIgnoreCase(code)){
    
    
        return ReapBean.error("验证码输入错误,请重新输入!");
    }


猜你喜欢

转载自blog.csdn.net/weixin_45561352/article/details/116779435