添加项目依赖
<!-- 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("验证码输入错误,请重新输入!");
}