java实现验证码完整版(未测试)

4

第一步:在web.xml中配置servlet

    <servlet>  
        <servlet-name>ImageServlet</servlet-name>  
        <servlet-class>org.servlet.ImageServlet</servlet-class>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>ImageServlet</servlet-name>  
        <url-pattern>/ImageServlet</url-pattern>  
    </servlet-mapping>  

第二步: ImageServlet 实现
    import javax.servlet.ServletException;  
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
      
    import com.farm.web.tool.RandomValidateCode;  
      
    public class ImageServlet extends HttpServlet {  
      
        private static final long serialVersionUID = 1L;  
      
        public void doGet(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
      
            response.setContentType("image/jpeg");// 设置相应类型,告诉浏览器输出的内容为图片  
            response.setHeader("Pragma", "No-cache");// 设置响应头信息,告诉浏览器不要缓存此内容  
            response.setHeader("Cache-Control", "no-cache");  
            response.setDateHeader("Expire", 0);  
            RandomValidateCode randomValidateCode = new RandomValidateCode();  
            try {  
                randomValidateCode.getRandcode(request, response);// 输出图片方法  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
      
        public void doPost(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
            doGet(request, response);  
        }  
      
    }  

    import java.awt.Color;  
    import java.awt.Font;  
    import java.awt.Graphics;  
    import java.awt.image.BufferedImage;  
    import java.util.Random;  
      
    import javax.imageio.ImageIO;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
    import javax.servlet.http.HttpSession;  
      
    public class RandomValidateCode {  
      
        public static String validateCode = null;  
        public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";// 放到session中的key  
        private Random random = new Random();  
        private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机产生的字符串  
      
        private int width = 80;// 图片宽  
        private int height = 26;// 图片高  
        private int lineSize = 40;// 干扰线数量  
        private int stringNum = 4;// 随机产生字符数量  
      
        /* 
         * 获得字体 
         */  
        private Font getFont() {  
            return new Font("Fixedsys", Font.CENTER_BASELINE, 18);  
        }  
      
        /* 
         * 获得颜色 
         */  
        private Color getRandColor(int fc, int bc) {  
            if (fc > 255)  
                fc = 255;  
            if (bc > 255)  
                bc = 255;  
            int r = fc + random.nextInt(bc - fc - 16);  
            int g = fc + random.nextInt(bc - fc - 14);  
            int b = fc + random.nextInt(bc - fc - 18);  
            return new Color(r, g, b);  
        }  
      
        /** 
         * 生成随机图片 
         */  
        public void getRandcode(HttpServletRequest request,  
                HttpServletResponse response) {  
            HttpSession session = request.getSession();  
            // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类  
            BufferedImage image = new BufferedImage(width, height,  
                    BufferedImage.TYPE_INT_BGR);  
            Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作  
            g.fillRect(0, 0, width, height);  
            g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));  
            g.setColor(getRandColor(110, 133));  
            // 绘制干扰线  
            for (int i = 0; i <= lineSize; i++) {  
                drowLine(g);  
            }  
            // 绘制随机字符  
            String randomString = "";  
            for (int i = 1; i <= stringNum; i++) {  
                randomString = drowString(g, randomString, i);  
            }  
            session.removeAttribute(RANDOMCODEKEY);  
            session.setAttribute(RANDOMCODEKEY, randomString);  
            validateCode = randomString.toUpperCase();  
            g.dispose();  
            try {  
                ImageIO.write(image, "JPEG", response.getOutputStream());// 将内存中的图片通过流动形式输出到客户端  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
      
        /* 
         * 绘制字符串 
         */  
        private String drowString(Graphics g, String randomString, int i) {  
            g.setFont(getFont());  
            g.setColor(new Color(random.nextInt(101), random.nextInt(111), random  
                    .nextInt(121)));  
            String rand = String.valueOf(getRandomString(random.nextInt(randString  
                    .length())));  
            randomString += rand;  
            g.translate(random.nextInt(3), random.nextInt(3));  
            g.drawString(rand, 13 * i, 16);  
            return randomString;  
        }  
      
        /* 
         * 绘制干扰线 
         */  
        private void drowLine(Graphics g) {  
            int x = random.nextInt(width);  
            int y = random.nextInt(height);  
            int xl = random.nextInt(13);  
            int yl = random.nextInt(15);  
            g.drawLine(x, y, x + xl, y + yl);  
        }  
      
        /* 
         * 获取随机的字符 
         */  
        public String getRandomString(int num) {  
            return String.valueOf(randString.charAt(num));  
        }  
    }  


第三步:jsp展现
    <tr>  
        <td>  
            <div align="right">  
                验证码:  
            </div>  
        </td>  
        <td>  
            <input style="width: 65px" id="validatecode" name="validatecode" type="text" />  
        </td>  
        <td>  
            <img title="看不清楚,换一张?" style="cursor: pointer;"  
                οnclick="javascript:refresh(this);"  
                src="<PF:basePath/>/ImageServlet">  
        </td>  
    </tr>  

src路径根据情况修改
    function refresh(obj) {  
        obj.src = "<PF:basePath/>/ImageServlet?"+Math.random();    
    }  

第四步:Action验证
if(RandomValidateCode.validateCode!=null&&validatecode.trim().toUpperCase().equals(RandomValidateCode.validateCode)){  
    System.out.println("验证码正确");  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值