千家信息网

Java如何实现OAuth2.0授权系统的验证码功能

发表于:2025-11-11 作者:千家信息网编辑
千家信息网最后更新 2025年11月11日,本篇内容介绍了"Java如何实现OAuth2.0授权系统的验证码功能"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,
千家信息网最后更新 2025年11月11日Java如何实现OAuth2.0授权系统的验证码功能

本篇内容介绍了"Java如何实现OAuth2.0授权系统的验证码功能"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1.集成EasyCaptcha:

         com.github.whvcse      easy-captcha      1.6.2   

2.生成验证码并保存到Redis中:

/**     * 验证码     *     * @return     */    @GetMapping("/captcha")    public Result captcha() {         String captchaKey = "captcha_" + UUID.randomUUID();        // 三个参数分别为宽、高、位数        SpecCaptcha captcha = new SpecCaptcha(130, 60, 4);        // 设置字体 有默认字体,可以不用设置        captcha.setFont(new Font("Verdana", Font.PLAIN, 32));        // 设置类型,纯数字、纯字母、字母数字混合        captcha.setCharType(Captcha.TYPE_ONLY_NUMBER);        log.info("key: [{}] ,code: [{}]", captchaKey, captcha.text());        // 存入Redis ,默认两分钟        redisBaseUtil.set(captchaKey, captcha.text(), 2, TimeUnit.MINUTES);        Map map = new HashMap<>(4);        map.put("captchaKey", captchaKey);        map.put("image", captcha.toBase64());        return Result.success(map);     }

3. 校验验证码的Filter:

package com.hanxiaozhang.filter; import com.hanxiaozhang.constant.Constant;import com.hanxiaozhang.redis.util.RedisUtil;import com.hanxiaozhang.result.ResultCode;import com.hanxiaozhang.result.Result;import com.hanxiaozhang.util.JsonUtil;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest;import java.util.Map; /** * 〈一句话功能简述〉
* 〈验证码过滤器〉 * * @author hanxinghua * @create 2021/4/4 * @since 1.0.0 */@Slf4j@Componentpublic class CaptchaFilter extends ZuulFilter { @Autowired private RedisUtil redisBaseUtil; @Override public String filterType() { return FilterConstants.PRE_TYPE; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext currentContext = RequestContext.getCurrentContext(); HttpServletRequest serverHttpRequest = currentContext.getRequest(); String uri = serverHttpRequest.getRequestURI(); if (uri.contains("/oauth/token")) { String method = serverHttpRequest.getMethod(); // 处理跨域Post发送两次请求 if (Constant.OPTIONS.equals(method)) { return null; } Map parameterMap = serverHttpRequest.getParameterMap(); String[] captchaKeys = null, captchaCodes = null; if (!parameterMap.isEmpty() && (captchaKeys = parameterMap.get("captcha_key")) != null && (captchaCodes = parameterMap.get("captcha_code")) != null) { String captchaKey = captchaKeys[0]; String captchaCode = captchaCodes[0]; log.info("Request Captcha Parameters: key: [{}] ,code: [{}]", captchaKey, captchaCode); String redisCaptchaCode = redisBaseUtil.get(captchaKey); String responseBody = null; if (redisCaptchaCode == null) { responseBody = JsonUtil.beanToJson(Result.error(ResultCode.LOGIN_CAPTCHA_EXPIRE)); } else if (!captchaCode.trim().equalsIgnoreCase(redisCaptchaCode)) { responseBody = JsonUtil.beanToJson(Result.error(ResultCode.LOGIN_CAPTCHA_ERROR)); } if (responseBody != null) { currentContext.setSendZuulResponse(false); currentContext.setResponseStatusCode(200); currentContext.getResponse().setContentType(Constant.APP_JSON_UTF_8); log.info("Response Parameters: [{}]", responseBody); currentContext.setResponseBody(responseBody); } } } return null; }}

4.使用,这里使用《Idea中HTTP Client请求测试工具》:

4.1 获取验证码:

GET http://localhost/api/system/captcha

4.2 校验验证码:

POST  http://localhost/api/system/oauth/token?username={{username}}&password={{password}}&grant_type=password&scope={{scope}}&client_id={{client_id}}&client_secret={{client_secret}}&captcha_key=captcha_23cacfe5-2751-44af-a34d-5e795caeb46a&captcha_code=5594

"Java如何实现OAuth2.0授权系统的验证码功能"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0