验证码功能是怎么做的? 请提供一点思路,当然有源码最好。
怎么存到session 然后对比啊

解决方案 »

  1.   

    一、index.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        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>Insert title here</title>
    <script type="text/javascript">
    function reloadImage(){
    document.getElementById("identity").src = "IdentityServlet?ts="+new Date().getTime();
    }
    </script>
    </head>
    <body>
    <img alt="" src="IdentityServlet" id="identity">
    <input type="button" value="换个图片" onclick="reloadImage();">
    </body>
    </html>二、IdentityServlet
    package cn.bddy;import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;/**
     * Servlet implementation class IdentityServlet
     */
    public class IdentityServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final char[] CHARS = { '2', '3', '4', '5', '6', '7', '8',
    '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M',
    'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
    private static Random random = new Random(); // 返回随机字符串
    public static String getRandomString() {
    StringBuffer buffer = new StringBuffer();
    for (int i = 0; i < 6; i++) {
    buffer.append(CHARS[random.nextInt(CHARS.length)]);
    }
    return buffer.toString();
    } // 返回背景色
    public static Color getRandomColor() {
    return new Color(random.nextInt(255), random.nextInt(255),
    random.nextInt(255));
    } // 返回某颜色的反色
    public static Color getReverseColor(Color c) {
    return new Color(255 - c.getRed(), 255 - c.getGreen(),
    255 - c.getBlue());
    } protected void doGet(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("image/jpeg");// 设置输出类型,必须的
    String randomString = getRandomString();// 获取随机字符串
    request.getSession().setAttribute("randomString", randomString);
    int width = 100;// 图片宽度
    int height = 30;// 图片高度
    Color color = getRandomColor();// 随即颜色,用于背景色
    Color reverse = getReverseColor(color);// 反色,用于前景色
    BufferedImage bi = new BufferedImage(width, height,
    BufferedImage.TYPE_INT_RGB);//创建一个彩色图片
    Graphics2D g = bi.createGraphics();//获取绘图对象
    g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,16));//设置字体
    g.setColor(color);//设置颜色
    g.fillRect(0, 0, width, height);//绘制背景
    g.setColor(reverse);//设置颜色
    g.drawString(randomString, 18, 20);
    //画最多100个噪音点
    for(int i=0,n=random.nextInt(100);i<n;i++){
    g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);
    }
    ServletOutputStream out = response.getOutputStream();
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    encoder.encode(bi);//对图片进行编码
    out.flush();//输出到客户端
    } protected void doPost(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    }}
    如果不知道怎么放到你的项目中我可以把这个验证码的项目发给你    要的话留下邮箱
      

  2.   


    <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*;,javax.imageio.*" %>
    <!---------------------------------------- 算出随机RGB颜色-->
    <%! 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);
    //---------------------------内存中创建一个60*20大小图形
    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);----------|颜色
    for(int i=0;i<155;i++)
    {
    int x= random.nextInt(width);
    int y= random.nextInt(width);
    int xl= random.nextInt(width);
    int yl= random.nextInt(width);
    g.grawLine(x,y,x+xl,y+yl);                //  GRAWLINE 功能是X,Y   XL,YL 划线  循环一百五十五条     = =.....  好多.... 待效果.....
    }
    String sRand="";
    for(int i=0; i<4,i++){
    String rand=String.valueOf(random.nextInt(10));//------------|随机产生0-9的数字并强制转换为字符
    sRand+=rand;//-----------------------------------------------|再将字符链接到一起
    g.setColor(new Color(20+random.nextInt(110),40+random.nextInt(110),60+random.nextInt(110))); //随机生成颜色 不要浅色 颜色也最好不要相同 ,所以取值区间不同
    g.drawString(rand,13*i+6,16); //将验证码计算出并显示到图像中 (Strign字符,X坐标,Y坐标,锚点)  啥时锚点?
    }
    session.setAttribute("rand",sRand); //将验证码存到SESSION 然后把它扔回去做验证
    g.dispose();
    ImageIO.write(image,"JPEG",response,getOutputStrem()); //输出图像到页面
    %>
      

  3.   

    这个代码我有,我也会引用,但是我不会取出来比较
     session.setAttribute("rand",sRand); //将验证码存到SESSION 然后把它扔回去做验证 
    这个该怎么取呢? 
      

  4.   


    String 变量=(String)session.getAttribute("session变量"); 
    在表单的POST页里判断用户输入值和验证码是否相符
      

  5.   

    session 中取到的值第一次为null, 以后每次都是上次存的,怎么解决呢?
    不用说废话,直接上解决方法就好。
      

  6.   

    不可能,大部是可以用的。
    这其实就是一个用servlet或jsp来画图罢了。然后显示出来。
    存session中是很容易的事。session.setAttribute() 方法来完成。