1.生成隨機(jī)驗(yàn)證碼,存入session;
2.生成包含驗(yàn)證碼的圖片文件,并且響應(yīng)給客戶端;
3.基于原生servlet還是springmvc或者webflux都可以;
4.關(guān)鍵代碼
4.1 驗(yàn)證碼工具類(網(wǎng)上很多令宿,不是關(guān)鍵)
4.2? session
基于servlet
//存入會(huì)話session
HttpSession session = request.getSession(true);
session.setAttribute(''key'', ''verifyCode'');
基于webflux(webSession使用參數(shù)注入)
webSession.getAttributes().put('key'', ''verifyCode'');
4.3 響應(yīng)
基于servlet
response.getOutputStream()
基于webflux(Mono<Void>)
1.通過生成的圖片文件讀取響應(yīng)
ZeroCopyHttpOutputMessage zeroCopyResponse = (ZeroCopyHttpOutputMessage) response;
return zeroCopyResponse.writeWith(file,positon,size);//進(jìn)行文件流響應(yīng)
這種方式或者說通過文件讀取的方式的響應(yīng)的方式叼耙,無法及時(shí)刪除生成的文件
2.通過生成的圖片文件然后獲取對(duì)應(yīng)的字節(jié)數(shù)組進(jìn)行響應(yīng)
//響應(yīng)字節(jié)流 同時(shí)刪除生成的圖片文件
return response.writeWith(Flux.create(sink ->{
NettyDataBufferFactory nettyDataBufferFactory =new NettyDataBufferFactory(new UnpooledByteBufAllocator(false));
try {
DataBuffer dataBuffer= nettyDataBufferFactory.wrap(toByteArray(file));
sink.next(dataBuffer);
}catch (Exception e) {
throw new RuntimeException(e);
}
sink.complete();
}));
這種方式的好處是在獲取對(duì)應(yīng)的圖片文件字節(jié)數(shù)組后把圖片文件刪除toByteArray(file)方法里刪除文件file