Pig4Cloud之驗證碼

登陸前端代碼

<template #append>
          <div class="login-code">
            <span
                class="login-code-img"
                @click="refreshCode"
                v-if="code.type === 'text'"
            >{{ code.value }}</span
            >
            <img
                :src="code.src"
                class="login-code-img"
                @click="refreshCode"
                v-else
            />
          </div>
        </template>

刷新驗證碼代碼

refreshCode() {
      this.loginForm.code = "";
      this.loginForm.randomStr = randomLenNum(this.code.len, true);
      this.code.type === "text"
          ? (this.code.value = randomLenNum(this.code.len))
          : (this.code.src = `${this.baseUrl}/code?randomStr=${this.loginForm.randomStr}`);
    }

驗證碼配置開關

前端開關

位于website.js中配置validateCode屬性

validateCode: true,//是否開啟驗證碼校驗

后端開關

位于pig-gateway-dev.yml配置文件

# 不校驗驗證碼終端
gateway:
  encode-key: 'thanks,pig4cloud'
  ignore-clients:
    - test
    - client

生成驗證碼

pig-gate-way模塊pom.xml

  <!--驗證碼 源碼: https://github.com/pig-mesh/easy-captcha -->
        <dependency>
            <groupId>com.pig4cloud.plugin</groupId>
            <artifactId>captcha-spring-boot-starter</artifactId>
            <version>${captcha.version}</version>
        </dependency>

captcha-spring-boot-starter中對驗證碼進行了配置区赵,這里不詳細展開說明传趾。

基于webflux生成驗證碼

@Slf4j
@Configuration(proxyBeanMethods = false)
@RequiredArgsConstructor
public class RouterFunctionConfiguration {

    private final ImageCodeHandler imageCodeHandler;

    @Bean
    public RouterFunction<ServerResponse> routerFunction() {
        return RouterFunctions.route(
                RequestPredicates.path("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), imageCodeHandler);
    }

}

RouterFunctionConfiguration用來注冊一個路由和它的處理程序罩扇。

proxyBeanMethods配置類是用來指定@Bean注解標注的方法是否使用代理,默認是true使用代理竹习,直接從IOC容器之中取得對象;如果設置為false,也就是不使用注解帮坚,每次調用@Bean標注的方法獲取到的對象和IOC容器中的都不一樣踩身,是一個新的對象萤晴。

Spring 5.2.0+的版本吐句,建議你的配置類均采用Lite模式去做,即顯示設置proxyBeanMethods = false店读。Spring Boot在2.2.0版本(依賴于Spring 5.2.0)起就把它的所有的自動配置類的此屬性改為了false嗦枢,即@Configuration(proxyBeanMethods = false),提高Spring啟動速度屯断。

RouterFunction為我們應用程序添加一個新的路由文虏,這個路由需要綁定一個HandlerFunction,做為它的處理程序殖演,里面可以添加業(yè)務代碼氧秘。

ImageCodeHandler

@Slf4j
@RequiredArgsConstructor
public class ImageCodeHandler implements HandlerFunction<ServerResponse> {

    private static final Integer DEFAULT_IMAGE_WIDTH = 100;

    private static final Integer DEFAULT_IMAGE_HEIGHT = 40;

    private final RedisTemplate<String, Object> redisTemplate;

    @Override
    public Mono<ServerResponse> handle(ServerRequest serverRequest) {
        ArithmeticCaptcha captcha = new ArithmeticCaptcha(DEFAULT_IMAGE_WIDTH, DEFAULT_IMAGE_HEIGHT);

        String result = captcha.text();

        // 保存驗證碼信息
        Optional<String> randomStr = serverRequest.queryParam("randomStr");
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        randomStr.ifPresent(s -> redisTemplate.opsForValue().set(CacheConstants.DEFAULT_CODE_KEY + s, result,
                SecurityConstants.CODE_TIME, TimeUnit.SECONDS));

        // 轉換流信息寫出
        FastByteArrayOutputStream os = new FastByteArrayOutputStream();
        captcha.out(os);

        return ServerResponse.status(HttpStatus.OK).contentType(MediaType.IMAGE_JPEG)
                .body(BodyInserters.fromResource(new ByteArrayResource(os.toByteArray())));
    }

}

校驗驗證碼

網(wǎng)關配置

pig-gateway-dev.yml中配置ValidateCodeGatewayFilter

image

校驗驗證碼

public class ValidateCodeGatewayFilter extends AbstractGatewayFilterFactory {
    @Override
    public GatewayFilter apply(Object config) {
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();


            // 終端設置不校驗, 直接向下執(zhí)行
            String[] clientInfos = WebUtils.getClientId(request);
            if (filterIgnorePropertiesConfig.getClients().contains(clientInfos[0])) {
                return chain.filter(exchange);
            }

            //校驗驗證碼
            checkCode(request);

            return chain.filter(exchange);
        };
    }
}

checkCode方法

@SneakyThrows
    private void checkCode(ServerHttpRequest request) {
        String code = request.getQueryParams().getFirst("code");

        if (CharSequenceUtil.isBlank(code)) {
            throw new ValidateCodeException("驗證碼不能為空");
        }

        String randomStr = request.getQueryParams().getFirst("randomStr");
        if (CharSequenceUtil.isBlank(randomStr)) {
            randomStr = request.getQueryParams().getFirst(SecurityConstants.SMS_PARAMETER_NAME);
        }

        String key = CacheConstants.DEFAULT_CODE_KEY + randomStr;

        Object codeObj = redisTemplate.opsForValue().get(key);

        if (ObjectUtil.isEmpty(codeObj) || !code.equals(codeObj)) {
            throw new ValidateCodeException("驗證碼不合法");
        }

        redisTemplate.delete(key);
    }

CSDN
騰訊云
掘金
博客園

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趴久,一起剝皮案震驚了整個濱河市丸相,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌彼棍,老刑警劉巖灭忠,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膳算,死亡現(xiàn)場離奇詭異,居然都是意外死亡弛作,警方通過查閱死者的電腦和手機涕蜂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來映琳,“玉大人宇葱,你說我怎么就攤上這事】罚” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵诸尽,是天一觀的道長原杂。 經(jīng)常有香客問我,道長您机,這世上最難降的妖魔是什么穿肄? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮际看,結果婚禮上咸产,老公的妹妹穿的比我還像新娘。我一直安慰自己仲闽,他們只是感情好脑溢,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赖欣,像睡著了一般屑彻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顶吮,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天社牲,我揣著相機與錄音,去河邊找鬼悴了。 笑死搏恤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的湃交。 我是一名探鬼主播熟空,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼巡揍!你這毒婦竟也來了痛阻?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤腮敌,失蹤者是張志新(化名)和其女友劉穎阱当,沒想到半個月后俏扩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡弊添,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年录淡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片油坝。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫉戚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澈圈,到底是詐尸還是另有隱情彬檀,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布瞬女,位于F島的核電站窍帝,受9級特大地震影響,放射性物質發(fā)生泄漏诽偷。R本人自食惡果不足惜坤学,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望报慕。 院中可真熱鬧深浮,春花似錦、人聲如沸眠冈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洋闽。三九已至玄柠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诫舅,已是汗流浹背羽利。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留刊懈,地道東北人这弧。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像虚汛,于是被迫代替她去往敵國和親匾浪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容