zoukankan      html  css  js  c++  java
  • Response生成注册验证码实现例子02

    Servlet生成注册验证码图片CheckCodeServlet.java 示例2:

    import java.awt.Color;  
    import java.awt.Font;  
    import java.awt.Graphics;  
    import java.awt.image.BufferedImage;  
    import java.io.ByteArrayOutputStream;  
    import java.io.IOException;  
    import javax.imageio.ImageIO;  
    import javax.servlet.ServletException;  
    import javax.servlet.ServletOutputStream;  
    import javax.servlet.http.HttpServlet;  
    import javax.servlet.http.HttpServletRequest;  
    import javax.servlet.http.HttpServletResponse;  
    import javax.servlet.http.HttpSession;  
    @SuppressWarnings("serial")  
    public class CheckCodeServlet extends HttpServlet {  
        private static int WIDTH = 60;  
        private static int HEIGHT = 20;  
        public void doGet(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
            HttpSession session = request.getSession();  
            response.setContentType("image/jpeg");  
            ServletOutputStream sos = response.getOutputStream();  
            // 设置浏览器不要缓存此图片  
            response.setHeader("Pragma", "No-cache");  
            response.setHeader("Cache-Control", "no-cache");  
            response.setDateHeader("Expires", 0);  
            // 创建内存图象并获得其图形上下文  
            BufferedImage image =new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);  
            Graphics g = image.getGraphics();  
            // 产生随机的认证码  
            char[] rands = generateCheckCode();  
            // 产生图像  
            drawBackground(g);  
            drawRands(g, rands);  
            // 结束图像的绘制过程,完成图像  
            g.dispose();  
            // 将图像输出到客户端  
            ByteArrayOutputStream bos = new ByteArrayOutputStream();  
            ImageIO.write(image, "JPEG", bos);  
            byte[] buf = bos.toByteArray();  
            response.setContentLength(buf.length);  
            // 下面的语句也可写成:bos.writeTo(sos);  
            sos.write(buf);  
            bos.close();  
            sos.close();  
            // 将当前验证码存入到Session中  
            session.setAttribute("check_code", new String(rands));  
            // 直接使用下面的代码将有问题,Session对象必须在提交响应前获得  
            // request.getSession().setAttribute("check_code",new String(rands));  
        }  
        private char[] generateCheckCode(){  
            // 定义验证码的字符表  
            String chars = "0123456789abcdefghijklmnopqrstuvwxyz";  
            char[] rands = new char[4];  
            for (int i = 0; i < 4; i++){  
                int rand = (int) (Math.random() * 36);  
                rands[i] = chars.charAt(rand);  
            }  
            return rands;  
        }  
        private void drawRands(Graphics g, char[] rands){  
            g.setColor(Color.BLACK);  
            g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));  
            // 在不同的高度上输出验证码的每个字符  
            g.drawString("" + rands[0], 1, 17);  
            g.drawString("" + rands[1], 16, 15);  
            g.drawString("" + rands[2], 31, 18);  
            g.drawString("" + rands[3], 46, 16);  
            System.out.println(rands);  
        }  
        private void drawBackground(Graphics g){  
            // 画背景  
            g.setColor(new Color(0xDCDCDC));  
            g.fillRect(0, 0, WIDTH, HEIGHT);  
            // 随机产生120个干扰点  
            for (int i = 0; i < 120; i++){  
                int x = (int) (Math.random() * WIDTH);  
                int y = (int) (Math.random() * HEIGHT);  
                int red = (int) (Math.random() * 255);  
                int green = (int) (Math.random() * 255);  
                int blue = (int) (Math.random() * 255);  
                g.setColor(new Color(red, green, blue));  
                g.drawOval(x, y, 1, 0);  
            }  
        }  
    }  

    2,注册页面:check_code.html

     <h3>带有验证码的登录页面</h3>  
            <form action="servlet/LogonFormServlet" method="post">  
                用户名:<input type="text" name="name"><br>  
                密 码:<input type="password" name="pass"><br>  
                验证码:<input type="text" name="check_code">  
                <img src="servlet/CheckCodeServlet"><br>  
                <input type="submit" value="登录">  
            </form>  

    3,验证注册信息页面:LogonFormServlet.java

    import java.io.*;  
    import javax.servlet.*;  
    import javax.servlet.http.*;  
    @SuppressWarnings("serial")  
    public class LogonFormServlet extends HttpServlet {  
        public void service(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
            response.setContentType("text/html;charset=GB2312");  
            PrintWriter out = response.getWriter();  
            HttpSession session = request.getSession(false);  
            if (session == null)  
            {  
                out.println("验证码处理问题!");  
                return;  
            }  
            String savedCode = (String) session.getAttribute("check_code");  
            if (savedCode == null){  
                out.println("验证码处理问题!");  
                return;  
            }  
            String checkCode = request.getParameter("check_code");  
            if (!savedCode.equals(checkCode)){  
                // 验证码未通过,不从Session中清除原来的验证码,  
                // 以便用户可以后退回登录页面继续使用原来的验证码进行登录  
                out.println("验证码无效!");  
                return;  
            }  
            // 验证码检查通过后,从Session中清除原来的验证码,  
            // 以防用户后退回登录页面继续使用原来的验证码进行登录  
            session.removeAttribute("check_code");  
            out.println("验证码通过,服务器正在校验用户名和密码!");  
        }  
        public void doPost(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
      
            doGet(request, response);  
        }  
      
    }  
  • 相关阅读:
    解题:POI 2006 Periods of Words
    解题:NOI 2014 动物园
    1483. 最高平均分
    1438. 较大分组的位置(回顾)
    1258. 漂亮子数组
    1903. 部门统计(回顾)
    1509. 柠檬水找零
    1451. 到最近的人的最大距离
    1425. 比较含退格的字符串
    1394. 山羊拉丁文
  • 原文地址:https://www.cnblogs.com/lichone2010/p/3128070.html
Copyright © 2011-2022 走看看