在java web开放中,有时候在项目中用到验证码,我想问问,这个验证码是怎么通过后台传递到页面中去的,又是怎么生成的?哪位兄弟有成熟的方案?告知一二,最好详细点哦!

解决方案 »

  1.   

    如果是图形验证码的话,在JSP中设置访问地址为一个servlet,后台写一个servlet将图片以OutputStream的方式发送给页面就行了。
      

  2.   

    web.xml中配置
      <!-- 验证码的servlet -->
    <servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/servlet/test</url-pattern>
    </servlet-mapping>
    <!-- 验证码的servlet结束 -->
    TestServlet.java
    public class CheckCodeImageServlet extends HttpServlet { private static final long serialVersionUID = 4270611773617934545L;
    private static final int WIDTH = 50;
    private static final int HEIGHT = 20;
    private static final int LENGTH = 4; public void service(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");
    OutputStream out = response.getOutputStream(); BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
    Font mFont = new Font("Arial", Font.TRUETYPE_FONT, 18);
    Graphics g = image.getGraphics();
    Random random = new Random();
    // 设置背景颜色
    g.setColor(getRandColor(100, 200));
    g.fillRect(0, 0, WIDTH, HEIGHT); // 设置字体
    g.setFont(mFont); //设置字体颜色
    g.setColor(getRandColor(180, 250));
    for (int i = 0; i < 555; i++) {
    int x = random.nextInt(WIDTH - 1);
    int y = random.nextInt(HEIGHT - 1);
    int xl = random.nextInt(6) + 1;
    int yl = random.nextInt(12) + 1;
    g.drawLine(x, y, x + xl, y + yl);
    }
    for (int i = 0; i < 450; i++) {
    int x = random.nextInt(WIDTH - 1);
    int y = random.nextInt(HEIGHT - 1);
    int xl = random.nextInt(12) + 1;
    int yl = random.nextInt(6) + 1;
    g.drawLine(x, y, x - xl, y - yl);
    } String sRand = "";
    for (int i = 0; i < LENGTH; i++) {
    String tmp = getRandomChar();
    while(tmp.equalsIgnoreCase("0")||tmp.equalsIgnoreCase("o") || tmp.equalsIgnoreCase("1") ||tmp.equalsIgnoreCase("i")|| tmp.equalsIgnoreCase("l") ||tmp.equalsIgnoreCase("z")||tmp.equalsIgnoreCase("2") ){
    tmp = getRandomChar();
    }
    sRand += tmp;
    g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
    g.drawString(tmp, 12 * i + 1, 16);
    } HttpSession session = request.getSession(true);
    session.setAttribute("checkCode", sRand);
    g.dispose();
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    encoder.encode(image);
    out.close();
    } private String getRandomChar() {
    int rand = (int) Math.round(Math.random() * 2);
    long itmp = 0;
    char ctmp = '\u0000';
    switch (rand) {
    case 1:
    itmp = (long) Math.round(Math.random() * 25 + 97);
    ctmp = (char) itmp;
    return String.valueOf(ctmp);
    default:
    itmp = (long) (Math.random() * 9);
    return String.valueOf(itmp);
    }
    } // 设置颜色
    Color getRandColor(int fc, int bc) {
    Random random = new Random();
    fc = fc > 255 ? 255 : fc;
    bc = bc > 255 ? 255 : bc;
    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);
    }}
      

  3.   


    public class CodeAction extends Action {
    /*
     * Generated Methods
     */
    //验证码图片中可以出现的字符集,可根据需要修改
    private char mapTable[]={
    'a','b','c','d','e','f',
    'g','h','i','j','k','l',
    'm','n','o','p','q','r',
    's','t','u','v','w','x',
    'y','z','0','1','2','3',
    '4','5','6','7','8','9'};
    /** 
     * Method execute
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     */
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
    response.setContentType("image/jpeg");
    int width=65;
    int height=20;
    BufferedImage image = new BufferedImage(width, height, 
    BufferedImage.TYPE_INT_RGB); 
    // 获取图形上下文 
    Graphics g = image.getGraphics(); 
    // 设定背景色 
    g.setColor(new Color(0xDCDCDC)); 
    g.fillRect(0, 0, width, height); 
    //画边框 
    g.setColor(Color.black); 
    g.drawRect(0,0,width-1,height-1); 
    // 取随机产生的认证码
    String strEnsure = "";
    // 4代表4位验证码,如果要生成更多位的认证码,则加大数值
    for(int i=0; i<4; ++i) {
    strEnsure+=mapTable[(int)(mapTable.length*Math.random())];
    }  
    //   将认证码显示到图像中,如果要生成更多位的认证码,增加drawString语句
    g.setColor(Color.black); 
    g.setFont(new Font("Atlantic Inline",Font.PLAIN,18)); 
    String str = strEnsure.substring(0,1); 
    g.drawString(str,8,17);  
    str = strEnsure.substring(1,2); 
    g.drawString(str,20,15); 
    str = strEnsure.substring(2,3); 
    g.drawString(str,35,18);   
    str = strEnsure.substring(3,4); 
    g.drawString(str,45,15); 
    // 随机产生10个干扰点
    Random rand = new Random();
    for (int i=0;i<10;i++) { 
    int x = rand.nextInt(width); 
    int y = rand.nextInt(height); 
    g.drawOval(x,y,1,1); 

    // 释放图形上下文
    g.dispose();
    ServletOutputStream os;
    request.getSession().setAttribute("codeVal", strEnsure);
    try {
    os = response.getOutputStream();
    // 输出图像到页面 
    ImageIO.write(image, "JPEG", os);
    } catch (IOException e) {
    }
    return null;
    }
    }
    jsp<img id="code" src="code.do" alt="点击换一张"
    onclick="javascript:reloadcode()">
      

  4.   

    到我的博客里看看是不是你想要的http://blog.csdn.net/jingyuwang1/archive/2011/05/19/6432086.aspx
      

  5.   

    有开源的:jCaptcha 和 patchca。