谷歌验证码实现
google图形验证码 所需的依赖
<!--google图形验证码-->
<dependency>
<groupId>com.github.axet</groupId>
<artifactId>kaptcha</artifactId>
<version>0.0.9</version>
</dependency>
CaptchaConfig
/**
*
* 验证码配置类
* @author HaoStar
* @date 2021/8/19 0019 14:35
* @param
* @return
*/
@Configuration
public class CaptchaConfig {
@Bean
public DefaultKaptcha defaultKaptcha(){
//验证码生成器
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;
}
}
登录验证码 CaptchaController
1.获取验证码文本内容
2.把验证码内容放到session中
3.根据文本验证码内容创建图形验证码,
4.输出流输出图片,格式为jpg
/**
* 登录验证码
*
* @author HaoStar
* @date 2021/8/19 0019 14:44
* @param
* @return
*/
@RestController
public class CaptchaController {
@Autowired
private DefaultKaptcha defaultKaptcha;
@ApiOperation(value = "登录验证码",produces = "image/jpeg")
@GetMapping("/captcha")
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 (outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//-------------------生成验证码 end --------------------------
}
}
SecurityConfig 配置文件中 配置放行请求url “/captcha”
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(
"/login",
"/logout",
"/css/**",
"/js/**",
"/index.html",
"favicon.ico",
"/doc.html",
"/webjars/**",
"/swagger-resources/**",
"/v2/api-docs/**",
"/captcha"
);
}
AdminServiceImpl
从session中获取验证码
@Override
public RespBean login(String username, String password, String code,HttpServletRequest request) {
String captcha = (String) request.getSession().getAttribute("captcha");
System.out.println("客户端输入code:"+code);
System.out.println("session中captcha:"+captcha);
if (StringUtils.isEmpty(code)||!captcha.equalsIgnoreCase(code)){
return RespBean.error("验证码输入错误,请重新输入!");
}
//登录
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
System.out.println("AdminServiceImpl下userDetails值:"+userDetails);
if(null==userDetails || !passwordEncoder.matches(password,userDetails.getPassword())){
return RespBean.error("用户名密码不能为空!");
}
if(!userDetails.isEnabled()){
return RespBean.error("账号被禁用,请联系管理员");
}
//把登录的对象放置在全文中,
//更新security 登录用户对象
UsernamePasswordAuthenticationToken authenticationToken= new
//第一个参数就是userDetails,第二个是凭证,也就是密码,为了安全放null,第三个就是权限
UsernamePasswordAuthenticationToken(userDetails,null,userDetails.getAuthorities());
//然后放在security全局中
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
//生成token
String token = jwtTokenUtil.generateToken(userDetails);
Map<String,String> map = new HashMap<>();
map.put("token",token);
map.put("tokenHead",tokenHead);
return RespBean.success("登录成功",map);
}