步骤:
定义一个封装验证码信息的类,ImageCode。
写一个生成验证码的接口,利用随机数生成验证码,并将生成的验证码信息存储进session。
springsecurity是由一系列filter接口来实现的,自定义一个filter继承OncePerRequestFilter,实现校验验证码的逻辑功能。
将这个自定义的filter添加进入springsecurity链中。
ImageCode中封装的信息有:
BufferedImage image //生成的验证码图片;
String code //验证码;
LocalDateTime expireTime //验证码的过期时间。
通常是指定一段时间后验证码过期,而不是指定一个具体的时间点说要几点几分过期,所以我在该类的构造方法中加入了一个参数 int expireIn,指定多少秒之后验证码过期。

调用此方法判断验证码是否过期:
验证码的生成代码网上一搜就会有很多,这里不在说了。下面用到了ImageIO类的方法将验证码图片返回至前端页面显示。
自定义一个验证码filter,继承OncePerRequestFilter,重置doFilterInternal方法,在该方法内部实现验证码校验。校验成功就调用filterChain.doFilter(request, response);方法。校验失败,捕获异常,然后直接return,切记不可调用filterChain.doFilter,不然会继续执行后续校验。
自定义filter完成之后,将其添加到SpringSecurity的执行链中去。
这行代码的意思就是,将imageCodeFilter,添加到UsernamePasswordAuthenticationFilter之前执行。
最后别忘了将生成验证码的接口路径放行。
在本篇中,只是对生成验证码的逻辑做一个简明介绍,没有涉及到详细代码,在下一篇中,对图片验证码和手机验证码做一个统一详细介绍。