SpringSecurity+thymeleaf - 图片验证码校验

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 验证主要步骤:1、访问登录页面,页面浏览器,被设置Cookie。2、页面刷新图片验证码,渲染到页面。3、页面登录提交,一同提交用户输入的imgcode。4、根据配置,先校验验证码,在校验用户密码。5、如果校验不通过,跳转登录错误页面。

登录页面提交

<div class="form-group">
    <div class="pull-left">
        <img alt="Code" onclick="this.src='/verify'" src="/verify" />
    </div>
    <div class="pull-right">
        <input type="text" class="form-control" id="imgcode" name="imgcode" placeholder="Code">
    </div>
</div>

图片验证码过滤器

/**
 * 图片验证码过滤器。
 * @author yanghaitao
 */
@Component
public class ImageCodeFilter extends OncePerRequestFilter {
    /**
     * 日志输出工具
     */
    private final static Logger LOGGER = LoggerFactory.getLogger(ImageCodeFilter.class);
    
    /**
     * 只在登录时对验证码进行拦截,验证
     */
    private static final String url = "/login";
    
    /**
     * redis缓存数据
     */
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    
    /**
     * 页面种植图片验证码cookie
     */
    @Value("${server.servlet.session.cookie.imgname}")
    private String imgCookieName;
    
    /**
     * 路径匹配工具
     */
    private AntPathMatcher antPathMatcher = new AntPathMatcher();
    
    /**
     * 验证码拦截
     */
    @Override
    protected void doFilterInternal(
            HttpServletRequest request, 
            HttpServletResponse response, 
            FilterChain filterChain)
            throws ServletException, IOException {
        // 拦截登录请求
        String requestURI = request.getRequestURI();
        if(antPathMatcher.match(url, requestURI) && "POST".equals(request.getMethod())) {
            // 获取种植的cookie
            String cookieValue = IpUtils.getCookieValue(request, imgCookieName);
            LOGGER.info("verify cookieValue : {}", cookieValue);
            // 获取验证码
            String imgcode = request.getParameter("imgcode");
            LOGGER.info("verify imgcode : {}", imgcode);
            // 获取redis缓存的验证码
            String imgcodeRedis = redisTemplate.opsForValue().get(cookieValue);
            try {
                redisTemplate.delete(cookieValue);
            } catch (Exception e) { }
            LOGGER.info("verify imgcodeRedis : {}", imgcodeRedis);
            // 验证码校验
            if(imgcode == null || !imgcode.equalsIgnoreCase(imgcodeRedis)) {
                response.sendRedirect("/login?error");
                LOGGER.info("verify sendRedirect : {}", "/login?error");
                return;
            }
        }
        
        filterChain.doFilter(request, response);
    }
    
}

配置验证码过滤器

注意:图片验证码请求要和静态资源一样放行,不然页面无法访问

@Autowired
private ImageCodeFilter imageCodeFilter;

@Override
protected void configure(HttpSecurity http) throws Exception {
    LOGGER.info("SecurityConfig HttpSecurity ... ");
    http.addFilterBefore(imageCodeFilter, UsernamePasswordAuthenticationFilter.class)
        .authorizeRequests()
        .antMatchers("/assets/**", "/verify").permitAll() // 放行地址与静态资源地址
        .anyRequest().authenticated() // 其他地址军需验证
        .and()
        .formLogin()
        .loginPage("/login")
        .successHandler(new SuccessLoginHandler())
        .permitAll()
        .and()
        .logout()
        .invalidateHttpSession(true)
        .clearAuthentication(true)
        .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
        // .logoutSuccessHandler(new SuccessLogoutHandler())
        .logoutSuccessUrl("/login?logout")
        .permitAll()
        .and().csrf().disable();
}
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
前端开发 安全 Java
SpringBoot 实现登录验证码(附集成SpringSecurity)
SpringBoot 实现登录验证码(附集成SpringSecurity)
287 0
|
4月前
|
XML 安全 Java
SpringSecurity系列(三) Spring Security 表单登录
SpringSecurity系列(三) Spring Security 表单登录
124 0
|
4月前
【SpringSecurity 】SpringSecurity 自定义登录页面
【SpringSecurity 】SpringSecurity 自定义登录页面
50 0
|
安全 Java 数据库
Spring Security详细讲解(JWT+SpringSecurity登入案例)
通过本篇博文,你可以详细了解Spring Security的相关概念与原理,并且掌握Spring Security的认证与授权,通过博文中的登入案例可以让自己定制去Spring Security认证授权方案。
Spring Security详细讲解(JWT+SpringSecurity登入案例)
|
安全 前端开发 Oracle
Spring Security表单登录认证
Spring Security是一个强有力并且高度定制化的认证和访问控制框架,致力于为Java应用程序提供认证和授权。
Spring Security表单登录认证
|
NoSQL 前端开发 JavaScript
Spring Boot整合Kaptcha登录页实现验证码功能
Spring Boot整合Kaptcha登录页实现验证码功能
262 0
|
存储 前端开发 安全
9-SpringSecurity:登录时的图片验证码
9-SpringSecurity:登录时的图片验证码
117 0
9-SpringSecurity:登录时的图片验证码
|
前端开发 Java 数据安全/隐私保护
3-SpringSecurity:自定义Form表单
3-SpringSecurity:自定义Form表单
143 0
3-SpringSecurity:自定义Form表单
|
安全 数据库 数据安全/隐私保护
SpringSecurity详细介绍RememberMe功能
本文我们来实现下SpringSecurity的RememberMe功能
SpringSecurity详细介绍RememberMe功能
|
存储 缓存 安全
SpringSecurity常用过滤器介绍
 本文我们来介绍下SpringSecurity中常用的过滤器及其加载的过程。
SpringSecurity常用过滤器介绍