JFinal使用技巧-验证码转为Base64输出为JSON返回

如题,对接一个系统,有验证码,不支持 cookie,返回有格式标准。话不多说,上码:

import com.jfinal.captcha.Captcha;
import com.jfinal.captcha.CaptchaManager;
import com.jfinal.captcha.CaptchaRender;
import com.jfinal.core.JFinal;
import com.jfinal.kit.Base64Kit;
import com.jfinal.kit.Kv;
import com.jfinal.kit.LogKit;
import com.jfinal.render.JsonRender;
import com.jfinal.render.RenderException;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * 生成Base64验证码
 */
public class Base64CaptchaRender extends CaptchaRender {

    /**
     * 生成验证码
     */
    public void render() {
        Captcha captcha = createCaptcha();
        CaptchaManager.me().getCaptchaCache().put(captcha);

        ByteArrayOutputStream sos = null;
        try {
            BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
            String key = captcha.getKey();
            String value = captcha.getValue();
            drawGraphic(value, image);

            if (JFinal.me().getConstants().getDevMode()){
                LogKit.debug("生成验证码: key=" + key  + "\t value=" + value);
            }

            sos = new ByteArrayOutputStream();
            ImageIO.write(image, "jpeg", sos);
            value = Base64Kit.encode(sos.toByteArray());

            new JsonRender(Kv.of("code", 0).set("msg", "ok")//
                    .set("data", Kv.of("captchaId", key).set("value", value))//
            ).setContext(request, response).render();
        } catch (IOException e) {
            if (getDevMode()) {
                throw new RenderException(e);
            }
        } catch (Exception e) {
            throw new RenderException(e);
        } finally {
            if (sos != null) {
                try {sos.close();} catch (IOException e) {
                    LogKit.logNothing(e);}
            }
        }
    }
}


使用姿势:

Controller...

public void captcha() {
    render(new Base64CaptchaRender());
}


public ApiRet xxx() {
    Kv kv = ...
    String captchaId = kv.getStr("captchaId");
    String verifyCode = kv.getStr("verifyCode");
    boolean validate = Base64CaptchaRender.validate(captchaId, verifyCode);
    if (!validate) {
        return new ApiRet(403, "验证码不正确");//ApiRet 自定义返回的数据结构类
    }
    ...
}


OK~ 

评论区

zzutligang

2023-07-13 19:22

必须赞!

小白菜111

2023-07-14 11:02

北流家园网

2023-07-18 09:14

+1,把ApiRet发出来看下,学习下如何封装

杜福忠

2023-07-18 10:07

@北流家园网 普通JavaBean,没啥内容,就是固定了属性字段,因为Kv等类的属性是set进去的动态的,而返回结构第一级是固定格式,每次写比较麻烦。

zeroabc

2023-07-20 17:46

fmpoffice

2023-08-05 09:26

跟大佬每天学一个姿势

热门分享

扫码入社