博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jfianl中将验证码做成拦截器,可以重复使用
阅读量:5833 次
发布时间:2019-06-18

本文共 7401 字,大约阅读时间需要 24 分钟。

hot3.png

验证码的位置(使用freemaker模板和bootstrap样式)

    
验证码    
        
        
        <#if errorCaptcha??>${errorCaptcha!}
            
    
        
    

生成验证码的调用代码

    /**     *生成验证码      */    public void captcha()    {        render(new MyCaptchaRender(60,22,4,true));    }

生成验证码的具体代码 MyCaptchaRender.java

import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.security.MessageDigest;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletOutputStream;import javax.servlet.http.Cookie;import com.jfinal.core.Controller;import com.jfinal.kit.StringKit;import com.jfinal.render.Render;public class MyCaptchaRender extends Render{    private static final long serialVersionUID = -7599510915228560611L;         private static final String[] strArr = {"3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y"};         private static String randomCodeKey = "JFINAL_JLHHWH_Key";    private static boolean caseInsensitive = true;         private int img_width = 85;    private int img_height = 20;    private int img_randNumber = 6;         public MyCaptchaRender() {    }         public MyCaptchaRender(String randomKey) {        if (StringKit.isBlank(randomKey))            throw new IllegalArgumentException("randomKey can not be blank");        randomCodeKey = randomKey;    }         public MyCaptchaRender(int width, int height, int count, boolean isCaseInsensitive) {              if(width <=0 || height <=0 || count <=0)        {            throw new IllegalArgumentException("Image width or height or count must be > 0");        }        this.img_width = width;        this.img_height = height;        this.img_randNumber = count;        caseInsensitive = isCaseInsensitive;    }         public MyCaptchaRender(String randomKey,int width, int height, int count, boolean isCaseInsensitive) {        if (StringKit.isBlank(randomKey))            throw new IllegalArgumentException("randomKey can not be blank");        randomCodeKey = randomKey;                 if(width <=0 || height <=0 || count <=0)        {            throw new IllegalArgumentException("Image width or height or count must be > 0");        }        this.img_width = width;        this.img_height = height;        this.img_randNumber = count;        caseInsensitive = isCaseInsensitive;    }         public void render() {        BufferedImage image = new BufferedImage(img_width, img_height, BufferedImage.TYPE_INT_RGB);        String vCode = drawGraphic(image);        vCode = encrypt(vCode);        Cookie cookie = new Cookie(randomCodeKey, vCode);        cookie.setMaxAge(-1);        cookie.setPath("/");        response.addCookie(cookie);        response.setHeader("Pragma","no-cache");        response.setHeader("Cache-Control","no-cache");        response.setDateHeader("Expires", 0);        response.setContentType("image/jpeg");                 ServletOutputStream sos = null;        try {            sos = response.getOutputStream();            ImageIO.write(image, "jpeg",sos);        } catch (Exception e) {            throw new RuntimeException(e);        }        finally {            if (sos != null)                try {sos.close();} catch (IOException e) {e.printStackTrace();}        }    }     private String drawGraphic(BufferedImage image){        // 获取图形上下文        Graphics g = image.createGraphics();        // 生成随机类        Random random = new Random();        // 设定背景色        g.setColor(getRandColor(200, 250));        g.fillRect(0, 0, img_width, img_height);        // 设定字体        g.setFont(new Font("Times New Roman", Font.PLAIN, 18));         // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到        g.setColor(getRandColor(160, 200));        for (int i = 0; i < 155; i++) {            int x = random.nextInt(img_width);            int y = random.nextInt(img_height);            int xl = random.nextInt(12);            int yl = random.nextInt(12);            g.drawLine(x, y, x + xl, y + yl);        }         // 取随机产生的认证码(img_randNumber位数字)        String sRand = "";        for (int i = 0; i < img_randNumber; i++) {            String rand = String.valueOf(strArr[random.nextInt(strArr.length)]);            sRand += rand;            // 将认证码显示到图象中            g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));            // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成            g.drawString(rand, 13 * i + 6, 16);        }         // 图象生效        g.dispose();                 return sRand;    }         /*     * 给定范围获得随机颜色     */    private Color getRandColor(int fc, int bc) {        Random random = new Random();        if (fc > 255)            fc = 255;        if (bc > 255)            bc = 255;        int r = fc + random.nextInt(bc - fc);        int g = fc + random.nextInt(bc - fc);        int b = fc + random.nextInt(bc - fc);        return new Color(r, g, b);    }         private static final String encrypt(String srcStr) {        try {            String result = "";            MessageDigest md = MessageDigest.getInstance("MD5");            byte[] bytes = md.digest(srcStr.getBytes("utf-8"));            for(byte b:bytes){                String hex = Integer.toHexString(b&0xFF).toUpperCase();                result += ((hex.length() ==1 ) ? "0" : "") + hex;            }            return result;        } catch (Exception e) {            throw new RuntimeException(e);        }    }     public static boolean validate(Controller controller, String inputRandomCode) {        if (StringKit.isBlank(inputRandomCode))            return false;        try {            if(caseInsensitive)                inputRandomCode = inputRandomCode.toUpperCase();            inputRandomCode = encrypt(inputRandomCode);            return inputRandomCode.equals(controller.getCookie(randomCodeKey));        } catch (Exception e) {            e.printStackTrace();            return false;        }    } }

你提交之后处理验证码的拦截器代码

import com.jfinal.aop.Interceptor;import com.jfinal.core.ActionInvocation;import com.jfinal.core.Controller;import com.yunbiji.render.MyCaptchaRender;public class MyCaptchaRenderInterceptor implements Interceptor{    public void intercept(ActionInvocation ai)    {        Controller c=ai.getController();        String inputRandomCode = c.getPara("captcha");        boolean validate = MyCaptchaRender.validate(c, inputRandomCode);                 /**         * 如果validate为true说明验证码输入正确         */        if(validate)        {            ai.invoke();        }        else        {            /**             * 对登录界面的验证码进行验证错误后的处理             */            if(ai.getMethodName().equals("login"))            {                c.setAttr("errorCaptcha", "验证码错误,请重新输入");                c.keepPara("passwd","username").render("login.html");            }            /**             * 对注册界面的验证码进行验证错误后的处理             */            else if(ai.getMethodName().equals("reg"))            {                c.setAttr("errorRegisterCaptcha", "验证码错误,请重新输入");                c.keepPara("name","email","qq","tel").render("register.html");            }        }    }}

在你的需要处理验证码的代码controller之前加上

@Before(MyCaptchaRenderInterceptor.class)

转载于:https://my.oschina.net/u/2004332/blog/343632

你可能感兴趣的文章
vue api
查看>>
nginx前端根据$remote_addr分发方法
查看>>
Delphi 指针大全
查看>>
我的友情链接
查看>>
playbook核心元素之 --> task 介绍(4)
查看>>
深入浅出Zabbix 3.0 -- 第十一章 VMware 监控
查看>>
Microsoft Hyper-V Server 2012快速上手之添加Hyper-v角色
查看>>
基于最新版本httpd-2.4编译安装及其服务配置(上)
查看>>
MySQL 备份和恢复策略
查看>>
linux fstab 管理
查看>>
高可用性网络在企业网中的应用
查看>>
Event.srcElement 中属性介绍
查看>>
Mysql数据库密码破解
查看>>
最牛B的编码套路
查看>>
[Unity3d]SecurityException报错解决办法
查看>>
我的友情链接
查看>>
网络 使用poll实现TCP服务器
查看>>
java23种设计模式收藏
查看>>
微信小程序富文本table超出宽度处理
查看>>
BaseHttpListActivity,几行代码搞定Android Http列表请求、加载和缓存
查看>>