Session实例:一次性验证码

 

Cookie功能没有关闭

       url重写

              第一次提交请求,在请求消息没有包含session的cookie,产生应答的时候用url重写的技术

              以后再提交请求的时候,请求消息中就会包含session的cookie

Cookie功能没有被禁掉:产生的应答消息都会用url重写

 

Session实例:一次性验证码

       loginForm.html

              <img src=”servlet/checkCode”>

              CheckCodeServlet:产生验证码  放在session对象里面

              LoginFormServlet:输入的验证码和图片中显示的验证码是否一致

实现代码:

CheckCodeServlet部分

       private static final long serialVersionUID = 1L;

       private static int WIDTH = 60;

       private static int HEIGHT = 20;// 图片高为20像素

       doGet方法中

              response.setContentType("image/jpeg");// 应答内容的类型

 

              ServletOutputStream out = response.getOutputStream();

 

              HttpSession session = request.getSession();// 会话对象的获取

 

              // 不能在客户端缓存验证码图片

              response.setHeader("Pragma", "no-cache");

              response.setHeader("Cache-Controll", "no-cache");

              response.setIntHeader("Expires", 0);// 设置失效时间

 

              // 画图——在内存中开辟一片缓冲区————背景

              BufferedImage bi = new BufferedImage(WIDTH, HEIGHT,

                            BufferedImage.TYPE_INT_RGB);// 制定画纸的宽度和高度

              Graphics g = bi.getGraphics();// 通过画纸调用方法得到画笔

 

              drawBackground(g);

 

              // 随机产生验证码

              char[] rands = generateCheckCode();// 随机产生4位的验证码

 

              // 输出,画在画纸上

              drawRands(g, rands);

 

              ByteArrayOutputStream bos = new ByteArrayOutputStream();

              ImageIO.write(bi, "JPEG", bos);// 按照什么样的形式转换JEPG

              // 定义一个字节数组

              byte[] buf = bos.toByteArray();// 将bi对象里面内容转换成了一个字节数组

              out.write(buf);

 

              // 设置应答内容的长度

              response.setContentLength(buf.length);

 

              session.setAttribute("checkCode", new String(rands));

 

              out.flush();

              out.close();

       }

drawRands方法

       private void drawRands(Graphics g, char[] rands) {

              // 画笔颜色

              g.setColor(Color.black);

              // 字符输出的字体,并加粗倾斜,字体大小为18

              g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));

              // 把字符输出

              g.drawString("" + rands[0], 1, 15);// 第1个字符

              g.drawString("" + rands[1], 16, 14);// 第2个字符

              g.drawString("" + rands[2], 31, 18);// 第3个字符

              g.drawString("" + rands[3], 46, 12);// 第4个字符

              System.out.println("=============");

              System.out.println(new String(rands));

       }

generateCheckCode方法

       private char[] generateCheckCode() {

              String chars = "0123456789abcdefghijklmnopqrstuvwxyz";// 把所有可能的字符放在一个数组里

              // 定义一个用来存放随机数的数组

              char rands[] = new char[4];

              for (int i = 0; i < 4; i++) {

                     int random = (int) (Math.random() * 36);// 随机产生chars中的下标

                     rands[i] = chars.charAt(random);

              }

              return rands;

       }

drawBackground方法

       private void drawBackground(Graphics g) {

              // 画背景

              g.setColor(new Color(0xDCDCDC));

              g.fillRect(0, 0, WIDTH, HEIGHT);// 填充的矩形,左上角和右下角顶点坐标

 

              // 画干扰线

              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);// 随机产生椭圆的线条,没有被填充

              }

       }

LoginFormServlet部分

       HttpSession session = request.getSession();

       String code = request.getParameter("checkCode");

       String value = session.getAttribute("checkCode").toString();

       if(value.equals(code)){

           out.println("验证码正确");

       }else{

           out.println("<font color=red>验证码不正确</font>");

       }

loginForm.html部分

   <h3>带有验证码的登录页面</h3>

   <form method="post" action="loginFormServlet" name="form1">

        用户名:<input type="text" name="userName"/></br>

        密&nbsp;码:<input type="password" name="password"/></br>

       验证码:<input type="text" name="checkCode"/>

       <img src="servlet/CheckCode"/></br>

       <input type="submit" value="submit"/>

   </form>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值