请教一个jsp问题---在jsp编写的网页里验证码的实现??
请教各位大侠!!!

解决方案 »

  1.   

    package com.ext.oa.common;import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    import java.awt.*;
    import java.awt.image.*;
    import java.util.*;
    import javax.imageio.*; /**
     * @author  jiaoxueli 
     * <br>Date: 2008-1-14
     */
    public class AuthImg extends HttpServlet
    {
        private Font mFont = new Font("Arial Black", Font.PLAIN, 16);
        public void init() throws ServletException
        {
            super.init();
        }
        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);
        }    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");
            
            int width=100, height=18;
            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(1, 1, width-1, height-1);
            g.setColor(new Color(102,102,102));
            g.drawRect(0, 0, width-1, height-1);
            g.setFont(mFont);        g.setColor(getRandColor(160,200));
            for (int i=0;i<155;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 < 70;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<6;i++)
            {
    String tmp = getRandomChar();
                sRand += tmp;
                g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
            g.drawString(tmp,15*i+10,15);
            }        HttpSession session = request.getSession(true);
            session.setAttribute("validCode",sRand);
            g.dispose();
            ImageIO.write(image, "JPEG", response.getOutputStream());
        }
        private String getRandomChar()
        {
    int rand = (int)Math.round(Math.random() * 2);
    long itmp = 0;
    char ctmp = '\u0000';
    switch (rand)
    {
    case 1:
    itmp = Math.round(Math.random() * 25 + 65);
    ctmp = (char)itmp;
    return String.valueOf(ctmp);
    case 2:
    itmp = Math.round(Math.random() * 25 + 97);
    ctmp = (char)itmp;
    return String.valueOf(ctmp);
    default :
    itmp = Math.round(Math.random() * 9);
    return String.valueOf(itmp);
    }
        }
    }
      

  2.   

    <img src="AuthImg" id="img" />
    jsp页面中这样引用
    上面是一个servlet,具体配置不用说了吧。
      

  3.   

    1.web.xml中的配置:
     <servlet>
       <servlet-name>image</servlet-name>
       <servlet-class>com.lhkj.util.beans.Image</servlet-class>
      </servlet>
    <servlet-mapping>
        <servlet-name>image</servlet-name>
        <url-pattern>/image</url-pattern>
      </servlet-mapping>2.将Image.java导入,与上面配置路径保持一致3.jsp页面中这样用:<td>验证码:</td>
    <td><input name="yzma" style="width:60" />&nbsp<img src="<%=request.getContextPath() %>/image"></td>
    4.action当中的设置:
    ManagerLoginForm mf = (ManagerLoginForm) form;
     String yzma = mf.getYzma();
       //      验证码
            String randCode ="0";
            if(request.getSession().getAttribute("randCode")!=null){
             randCode = request.getSession().getAttribute("randCode").toString();
            }
            if(yzma.equals(randCode)){
            
    //         调用servic层方法验证登录名密码,返回Manager对象
         Manager manager = jigouservice.checkManager(loginName, password);
    ......
    }
            }
    return mapping.findForward("error");
    }
      

  4.   

    能用javascript实现吗!!!定义一个funcation方法可以吗??
      

  5.   


    <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
    <%!
    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=18;
    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("rand",sRand);// 图象生效
    g.dispose();// 输出图象到页面
    ImageIO.write(image, "JPEG", response.getOutputStream());
    out.clear();
    out = pageContext.pushBody();
    %>
      

  6.   


                  <TD bgcolor="#FFFFFF"> <div align="left">
                          <INPUT NAME="useryz" TYPE="password" class="input" id="useryz" size="7">
                          <img src="../image.jsp" border=0 align="absmiddle"></div></TD>image.jsp就是上面的页面。
    然后用上面的方法就可以导入进来了。
      

  7.   

    网上有很多。要什么版本的都有jsp、servlet等
      

  8.   

    1.写一个生成验证码图片的jsp,这里帮你提供一个了,保存为image.jsp
    <%--生成验证码图片,contentType必须设置为"image/jpeg"--%>
    <%@ page contentType="image/jpeg" pageEncoding="GBK"%>
    <%@ page import="java.awt.*"%>
    <%@ page import="java.awt.image.*"%>
    <%@ page import="java.util.*"%>
    <%@ page import="javax.imageio.*"%><%!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("rand", sRand); // 图象生效
    g.dispose(); // 输出图象到页面
    ImageIO.write(image, "JPEG", response.getOutputStream());
    out.clear();
    out = pageContext.pushBody();
    %>
    2.在你需要显示验证码的页面(如index.jsp)加入<input name=rand type=text id="rand" />img id="randImg" src="image.jsp"/>
    3.写一个检查验证码的jsp,将下面代码保存为checkRandomNum.jsp:
    <%@ page language="java" contentType="text/html; charset=GBK"
    pageEncoding="GBK"%>
    <html>
    <%
    String randomNumEntered = request.getParameter("randomNumEntered");
    String randomNumGenerated = (String) session
    .getAttribute("rand"); if (randomNumEntered != null && randomNumGenerated != null) {
    if (!randomNumEntered.equalsIgnoreCase(randomNumGenerated)) {
    out.print("validate_failed:" + randomNumGenerated);
    } else {
    //out.println("<center>验证成功!</center>");
    out.print("validate_successful:" + randomNumGenerated);
    }
    }
    %>
    </html>
    4.通过ajax去验证,如果错误,刷新验证码,这里提供一个ajax的封装js,将下面代码保存为ajax.js
    /* namespacing object */
    var net = new Object();
    net.READY_STATE_UNINITIALIZED = 0;
    net.READY_STATE_LOADING = 1;
    net.READY_STATE_LOADED = 2;
    net.READY_STATE_INTERACTIVE = 3;
    net.READY_STATE_COMPLETE = 4;
    /*--- content loader object for cross-browser requests ---*/
    net.ContentLoader = function (url, on_load, on_error, method, params, contentType) {
    this.req = null;
    this.on_load = on_load;
    this.on_error = (on_error) ? on_error : this.defaultError;
    this.loadXMLDoc(url, method, params, contentType);
    };
    net.ContentLoader.prototype.loadXMLDoc = function (url, method, params, contentType) {
    if (!method) {
    method = "GET";
    }
    if (!contentType && method == "POST") {
    contentType = "application/x-www-form-urlencoded";
    }
    if (window.XMLHttpRequest) {
    this.req = new XMLHttpRequest();
    } else {
    if (window.ActiveXObject) {
       //add try catch;
    try {
    this.req = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e1) {
    try {
    this.req = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch (e2) {
    }
    }
         //
     //this.req=new ActiveXObject("Microsoft.XMLHTTP");
    }
    }
    if (this.req) {
    try {
    var loader = this;
    this.req.onreadystatechange = function () {
    net.ContentLoader.onReadyState.call(loader);
    };
    this.req.open(method, url, true);
    if (contentType) {
    this.req.setRequestHeader("Content-Type", contentType);
    }
    this.req.send(params);
    }
    catch (err) {
    this.on_error.call(this);
    }
    }
    };
    net.ContentLoader.onReadyState = function () {
    var req = this.req;
    var ready = req.readyState;
    if (ready == net.READY_STATE_COMPLETE) {
    var httpStatus = req.status;
    if (httpStatus == 200 || httpStatus == 0) {
    this.on_load.call(this);
    } else {
    this.on_load.call(this);
    }
    }
    };
    net.ContentLoader.prototype.defaultError = function () {
    alert("error fetching data!" + "\n\nreadyState:" + this.req.readyState + "\nstatus: " + this.req.status + "\nheaders: " + this.req.getAllResponseHeaders());
    };
    5.在index.jsp中通过javascript调用ajax去做验证
    function refreshRandImg(){
        var timenow = new Date().getTime();
        document.getElementById("randImg").src="image.jsp?d="+timenow;
    }
    function checkRandBack() {
      var gtext=this.req.responseText;
      alert(gtext);
      if(gtext.indexOf("validate_successful") != -1){
        document.messageForm.submit();
      }else{
        alert("验证码有误!");
        refreshRandImg();
      }
    }
    function submitForm(){
      var rand = document.getElementById("rand").value;
      if(rand.replace(/(^\s*)|(\s*$)/g, "") == "") {
        alert("请输入验证码");
        return false;
      }
      var url="<%=basePath%>page/jsp/checkRandomNum.jsp?randomNumEntered="+rand;
      var newxmlhttp=new net.ContentLoader(url,checkRandBack,"","get",null,null);
    }你可以下载我上传的资源"jsp+javabean版留言本":http://download.csdn.net/source/737585,里面有用到验证码,可以参考一下
      

  9.   

    上面是验证码的详细说明,[br]
    请参考我上传的资源"jsp+javabean版留言本":http://download.csdn.net/source/737585,里面有用到验证码,可以参考一下