当前位置:编程学习 > JAVA >>

注册时,java代码如何实现验证码。(

很多网站都有。图片在边上 --------------------编程问答-------------------- 连接数据库,从数据库中读取相应的验证码,一张图一个验证码,然后跟输入匹配 --------------------编程问答-------------------- 这需要和数据库相连吗?? --------------------编程问答-------------------- public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

//设置头信息
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setDateHeader("expires", 0);
response.setContentType("image/jpeg");

int w = 100,h = 20;

BufferedImage b = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
Graphics g = b.getGraphics();
g.setColor(new Color(255,255,255));
g.fillRect(0, 0, w, h);

//画干扰线,让图片看起来很乱
Random r = new Random();
for(int i = 0;i<300;i++){
int x = r.nextInt(w);
int y = r.nextInt(h);

int x2 = r.nextInt(w);
int y2 = r.nextInt(h);

g.setColor(this.getColor());
g.drawLine(x, y, x2, y2);
}
g.setColor(Color.red);
g.setFont(new Font("Arial",Font.BOLD,14));

String rand = this.getRandomStr();//得到产生的随机字符串
request.getSession().setAttribute("rand", rand);//把它放入session中

for(int i = 0;i<rand.length();i++){//在页面上把其画出来
g.drawString(rand.charAt(i)+"", 10+15*i, 15);
}
ImageIO.write(b, "jpeg", response.getOutputStream());
}

这是一个servlet的写法。你参考一下。 --------------------编程问答-------------------- 写个过滤器? --------------------编程问答--------------------

<%-- 
    Document   : image
    Created on : 2010-3-8, 15:32:40
    Author     : Administrator
--%>
<%@ page contentType="image/jpeg" import="java.util.*,java.awt.*,java.io.*,java.awt.image.*,javax.imageio.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
    <%!
        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);
        }
    %>
    <%
        //设置页面不缓存
        response.setHeader("Pragma","No-cache");
        response.setHeader("Cache-Control","no-cache");
        response.setDateHeader("Expires", 0);

        // 在内存中创建图象
        int width=60, height=20;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        // 获取图形上下文
        Graphics g = image.getGraphics();

        //生成随机类
        Random random = new Random();

        // 设定背景色
        g.setColor(getRandColor(200,250));
        g.fillRect(0, 0, width, height);

        //设定字体
        g.setFont(new Font("Times New Roman",Font.PLAIN,18));

        //画边框
        //g.setColor(new Color());
        //g.drawRect(0,0,width-1,height-1);

        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
        g.setColor(getRandColor(160,200));
        for (int i=0;i<155;i++)
        {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x,y,x+xl,y+yl);
        }

        // 取随机产生的认证码(4位数字)
        String sRand="";
        for (int i=0;i<4;i++){
            String rand=String.valueOf(random.nextInt(10));
            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);
        }

        // 将认证码存入SESSION
        session.setAttribute("randCode",sRand);

        // 图象生效
        g.dispose();
        OutputStream output=response.getOutputStream();

        // 输出图象到页面
        ImageIO.write(image, "JPEG", response.getOutputStream());
        output.flush();
        out.clear();
        out = pageContext.pushBody();
    %>

    </body>
</html>

这个是验证码的JSP文件,可以随机生成验证码并绘图,把它放到相应的位置的img标签里就OK了
它把验证码放在session,用randCode标识

--------------------编程问答-------------------- 学习了。 --------------------编程问答-------------------- 5楼的程序你可以试试。 --------------------编程问答--------------------
引用 3 楼 licip 的回复:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

//设置头信息
response.setHeader("pragma", "no-cache");
response.setHeader("cache-……


请问如何获取到图片里的验证码?
想验证输入的验证码是否正确时,不知道怎么取图里的验证码了…  --------------------编程问答--------------------

<tr>
 <td width="50%" align="right">验证码</td>
 <td width="50%"align="left"><inputname="checkCode"type="text"size="3" /><imgsrc="CheckCodeServlet">
</td>
  </tr>

<--!CheckCodeServlet 是你写验证码的servlset的 url-pattern-->
--------------------编程问答-------------------- 为什么放着jCaptcha和patchca这么好的东西不用,非得自己写验证码哪? --------------------编程问答-------------------- 5楼,直接在网页里的写法可行吗?? --------------------编程问答-------------------- liuyuhua0066说的对,除非你想开发一个框架,否则为嘛现成的不用?
难道你认为你开发的东西bug会比人家少?当然你若是为了学习那是另外一回事 --------------------编程问答--------------------
引用 11 楼 java_gannbare 的回复:
5楼,直接在网页里的写法可行吗??

java代码内嵌jsp页面当然可行 --------------------编程问答-------------------- 1楼的说连数据库,纯属瞎扯。没人这样做。
基本思路就是 
在Servlet中进行:
建立一个字符数组并赋值,指定将要在图片中出现的字符。当然也可以从字库中选取,不过笔画多的字可能会看不清。
构建一个 BufferedImage 图片缓存对象,通这图片缓存对象得到 JAVA2D 中的 Graphics 绘图对象
选取 要输出的字符,随机字体,字号,颜色等,绘制在图片缓存中,生成图片,response 输出;
页面上的图片标签src 直接指向 Servlet 的映射路径就可以了

--------------------编程问答-------------------- --------------------编程问答-------------------- 以下的代码如何使用,可以用在 *.vm 文件中吗??什么叫做把它放到相应的位置的img标签里就OK了


<%-- 
    Document   : image
    Created on : 2010-3-8, 15:32:40
    Author     : Administrator
--%>
<%@ page contentType="image/jpeg" import="java.util.*,java.awt.*,java.io.*,java.awt.image.*,javax.imageio.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
    <%!
        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);
        }
    %>
    <%
        //设置页面不缓存
        response.setHeader("Pragma","No-cache");
        response.setHeader("Cache-Control","no-cache");
        response.setDateHeader("Expires", 0);

        // 在内存中创建图象
        int width=60, height=20;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        // 获取图形上下文
        Graphics g = image.getGraphics();

        //生成随机类
        Random random = new Random();

        // 设定背景色
        g.setColor(getRandColor(200,250));
        g.fillRect(0, 0, width, height);

        //设定字体
        g.setFont(new Font("Times New Roman",Font.PLAIN,18));

        //画边框
        //g.setColor(new Color());
        //g.drawRect(0,0,width-1,height-1);

        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
        g.setColor(getRandColor(160,200));
        for (int i=0;i<155;i++)
        {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x,y,x+xl,y+yl);
        }

        // 取随机产生的认证码(4位数字)
        String sRand="";
        for (int i=0;i<4;i++){
            String rand=String.valueOf(random.nextInt(10));
            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);
        }

        // 将认证码存入SESSION
        session.setAttribute("randCode",sRand);

        // 图象生效
        g.dispose();
        OutputStream output=response.getOutputStream();

        // 输出图象到页面
        ImageIO.write(image, "JPEG", response.getOutputStream());
        output.flush();
        out.clear();
        out = pageContext.pushBody();
    %>

    </body>
</html>

--------------------编程问答-------------------- mark --------------------编程问答-------------------- 问题是如何校验,在session吗??可是,真的郁闷,session被框架进行了封装。 --------------------编程问答-------------------- 我是来学习的。。。 --------------------编程问答-------------------- 5楼的可以 但是如何在页面提交前能验证验证码呢?
--------------------编程问答-------------------- 我觉得产生验证码的程序应该放在后台,然后拿用户在前台输入的字符与后台的验证码来比较,这样更安全一些,不让别人通过看页面源码直接获取到。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,