文档章节

验证码

zhchl2010
 zhchl2010
发布于 2014/12/04 20:33
字数 526
阅读 10
收藏 0
1.spring mvc 中简单实现
@RequestMapping("/drawCheckCode")
    public void drawCheckCode(HttpServletResponse response,Integer width,Integer height) throws IOException{
        response.setContentType("image/jpg");
        if(width==null) width=200;
        if(height==null) height=100;
        int num=5;
        Random ran=new Random();
        String code="0123456789abcdefghijklmnopqrstuvwxyz";
        StringBuffer cc=new StringBuffer();
        for(int i=0;i<num;i++){
            cc.append(code.charAt(ran.nextInt(code.length())));
        }
        //创建一个图片对象
        BufferedImage img=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
        //获取画笔
        Graphics2D graphic=img.createGraphics();
        graphic.setColor(Color.WHITE);
        graphic.fillRect(0,0, width, height);
        graphic.setColor(Color.BLACK);
        graphic.drawRect(0,0, width-1, height-1);
        Font font=new Font("宋体",Font.BOLD+Font.ITALIC,(int)(height*0.8));
        graphic.setFont(font);
        for(int i=0;i<num;i++){
            graphic.setColor(new Color(ran.nextInt(255),
                    ran.nextInt(255),ran.nextInt(255)));
            graphic.drawString(String.valueOf(cc.charAt(i)),
                    i*(width/num),(int)(height*0.8));
        }
        //加一些点
        for(int i=0;i<(width+height);i++){
            graphic.setColor(new Color(ran.nextInt(255),
                    ran.nextInt(255),ran.nextInt(255)));
            graphic.drawOval(ran.nextInt(width),ran.nextInt(height),1,1);
        }
        //加一些干扰线
        for(int i=0;i<4;i++){
            graphic.setColor(new Color(ran.nextInt(255),
                    ran.nextInt(255),ran.nextInt(255)));
            graphic.drawLine(0,ran.nextInt(height),width,ran.nextInt(height));
        }
        OutputStream os=response.getOutputStream();
        ImageIO.write(img,"jpg",os);
    }

2.工具性封装
public class Captcha {

    private int width; //图片宽度
    private int height;//图片高度
    private int num;    //验证码字符数量
    private String code;//基础码
    private static final Random ran=new Random();
    private static Captcha captcha;
    
    private Captcha(){
        code="0123456789qwertyuioplkjhgfdsazxcvbnm";
        num=4;
    }
    
    public static Captcha getInstance(){
        if(captcha==null) captcha=new Captcha();
        return captcha;
    }
    
    public void set(int width,int height){
        this.width=width;
        this.height=height;
    }
    
    public String generateCheckcode(){
        StringBuffer cc=new StringBuffer();
        for(int i=0;i<num;i++){
            cc.append(code.charAt(ran.nextInt(code.length())));
        }
        return cc.toString();
    }
    
    public BufferedImage gennerateChackImg(String checkcode ){
        //创建一个图片对象
        BufferedImage img=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
        //获取画笔
        Graphics2D graphic=img.createGraphics();
        graphic.setColor(Color.WHITE);
        graphic.fillRect(0,0, width, height);
        graphic.setColor(Color.BLACK);
        graphic.drawRect(0,0, width-1, height-1);
        Font font=new Font("宋体",Font.BOLD+Font.ITALIC,(int)(height*0.8));
        graphic.setFont(font);
        for(int i=0;i<num;i++){
            graphic.setColor(new Color(ran.nextInt(255),
                    ran.nextInt(255),ran.nextInt(255)));
            graphic.drawString(String.valueOf(checkcode.charAt(i)),
                    i*(width/num),(int)(height*0.8));
        }
        //加一些点
        for(int i=0;i<(width+height);i++){
            graphic.setColor(new Color(ran.nextInt(255),
                    ran.nextInt(255),ran.nextInt(255)));
            graphic.drawOval(ran.nextInt(width),ran.nextInt(height),1,1);
        }
        //加一些干扰线
        for(int i=0;i<4;i++){
            graphic.setColor(new Color(ran.nextInt(255),
                    ran.nextInt(255),ran.nextInt(255)));
            graphic.drawLine(0,ran.nextInt(height),width,ran.nextInt(height));
        }
        return img;
    }
    
    public void set(int width,int height,int num,String code){
        this.width=width;
        this.height=height;
        this.num=num;
        this.code=code;
    }
    //setter和getter省略
}

spring mvc控制器代码:
    @RequestMapping("/drawCheckCode")
    public void drawCheckCode(HttpServletResponse response,HttpSession session) throws IOException{
        response.setContentType("image/jpg");
        int width=200;
        int height=30;
        Captcha c=Captcha.getInstance();
        c.set(width, height);
        String checkcode=c.generateCheckcode();
        session.setAttribute("cc",checkcode);
        System.out.println(checkcode);
        OutputStream os=response.getOutputStream();
        ImageIO.write(c.gennerateChackImg(checkcode),"jpg",os);
    }

3.jsp页面
<img src="drawCheckCode" onclick="reCheckcode(this)"/>
function reCheckcode(img){
    img.src="drawCheckCode?"+Math.random();
}


© 著作权归作者所有

共有 人打赏支持
上一篇: spring简单权限
下一篇: MD5加密
zhchl2010
粉丝 3
博文 80
码字总数 77710
作品 0
成都
程序员
私信 提问
【代码实现】PHP生成各种随机验证码

文章来源:PHP开发学习门户 (自行开发的个人网站) 验证码在WEB应用中非常重要,通常用来防止用户恶意提交表单,如恶意注册和登录、论坛恶意灌水等。本文将通过实例讲解使用PHP生成各种常见...

PHP开发学习门户
2014/10/07
0
0
使用Java制作验证码

验证码介绍 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是...

ZeroOne01
2017/11/19
0
0
TODO:Laravel增加验证码

TODO:Laravel增加验证码 1. 先聊聊验证码是什么,有什么作用? 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和...

OneTODO
2016/12/22
37
0
前嗅ForeSpider教程:验证码设置

当我们遇到某些网站,采集每一条数据都需要输入一条验证码时,就用到了验证码设置。今天,小编为大家详细介绍一下:前嗅ForeSpider中的验证码设置。具体操作如下: 当采集某些网站的数据时,...

forespider
03/07
0
0
python-56: 再一次尝试,再一次出错

好了,前面一小节我们对验证码的机制有了了解,同时又对cookies有了更深的认识,前面也说了,我们需要先获取cookies得到关于验证码的信息,然后带着这个cookies去post数据,我们再重新把流程...

达岭凹老大
2015/12/13
125
0

没有更多内容

加载失败,请刷新页面

加载更多

指针数组和数组指针的区别

这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。 指针数组:arr...

天王盖地虎626
20分钟前
0
0
Qt那些事0.0.18

今天要记一下Qt中的Resource。自我感觉理解的不错,但是还会难免有谬误,在日后有可能会更新,也有可能不会。 小声的念叨一句,女人心,海底针。 今天就直接跳过了关于QML在qrc文件中的介绍,...

Ev4n
29分钟前
0
0
深入解析js的作用域、预解析机制

虽然,ES6在我们工作中应用得越来越广泛,但是还是很多项目保留着ES5的写法,所以,今天,带着大家重新巩固下ES5下的作用域及预解析机制。 概念: 作用域:域,指的是一个空间、范围、区域,...

前端攻城老湿
31分钟前
0
0
Spring Cloud Feign - 声明式 REST Client

1、Feign是什么 声明式REST client,来自NetFlix。 允许你编写无实现代码调用REST services 替换RestTemplate(甚至更简单) Spring Cloud 为使用Feign提供了包装器 2、怎样使用Feign 对比:...

Benz001
37分钟前
2
0
前端、后端和全栈到底不该学什么

1、前言 在职业规划咨询过程中经常会被问到这样的问题: 老师,我是该深入钻研专精一门,走技术大牛路线,还是所有都要精通,做一个全栈工程师? 类似问题的变种还有,老师我是不是该30岁最迟...

前端攻城小牛
39分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部