Session应用--用servlet写一次性验证码

Session应用--用servlet写一次性验证码

一  写验证码的思路

    首先想到验证码的背景是看起来比较乱的,也就是要用java画出验证码的背景图片,而要想画出验证码的背景,在图片上应该有画纸,也要有画笔才能执行。可 想只能是随机的画出一个形状,才有在每次刷新的时候有不一样的效果。并且在画出的背景图片上有数字或字母,这也是随机生成的。是把可能的数字和字母放到一个字符串里来显示,然后根据下标随机获取。

二  实现一次性的验证码

1.首先建一个loginForm.html的网页,在网页上插入一个图片,为画背景提供空间

在loginForm.html中的代码如下:

<body>

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

    <form action="servlet/loginFormServlet"method="post">

     用户名:<inputtype="text"name="userName"size="15"/><br/>

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

    <br/> 验证码:<inputtype="text"name="checkCode"size="15"/>

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

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

    </form>

 </body>

从以上的代码中可以看出<img/>标签是用来画验证码的,并且它连接到的servlet是checkCode,所以建一个CheckCodeServlet来话验证码

 

2.建立一个checkCodeServlet.java 它的映射名为servlet/checkCode

(1)首先修改类型,因为传来的是一个图片的信息 

      response.setContentType("image/jpeg");

(2)设置没有缓存---因为在每次刷新之后都会是不同的数字或字母

    因为每个浏览器都是不同的,所以应设置三个没有缓存的字段

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

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

      response.setIntHeader("Expires", 0);

(3)画纸是存在一个缓冲区中的

    BufferedImage bi=new

BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);

注:缓冲区的宽、高、和使用的颜色

(4)画笔的设置---用Graphics来画

    Graphics g = bi.getGraphics();

(5)设置背景 --------调用函数drawBackground()

     drawBackground(g);

    public void drawBackground(Graphics g){

       // 填充颜色

       g.setColor(newColor(0xDCDCDC));

       // 画矩形--定位 填充的矩形

       g.fillRect(0, 0, WIDTH, HEIGHT);

       // 画干扰线

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

          // 画椭圆 随机产生

           int x = (int) (Math.random() * WIDTH);

          inty = (int)(Math.random()* HEIGHT);

 

          // 颜色的随机

          intred = (int)(Math.random()* 255);

          intgreen = (int)(Math.random()* 255);

          intblue = (int)(Math.random()* 255);

          g.setColor(newColor(red, green, blue));

          g.drawOval(x, y, 1, 0);

       }

    }

(6) 随机产生验证码-----调用一个方法

    char[] rands = generateCheckCode();

    private char[] generateCheckCode() {

       // 字符串存储所有可能的字符

       String chars ="0123456789abcdefghijklmnopqlstuvwxyz";

       char rands[] = new char[4];

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

          // 通过下标获取

          intrandom = (int)(Math.random()* 36);

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

       }  

       return rands;

    }

(7) 输出--------输出的时候要随机的输出

        drawRands(g, 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, 18);

      g.drawString("" + rands[2], 32, 15);

      g.drawString("" + rands[3], 46, 19);

    }

(8)第七步只是写到内存里去了,要想在网页上显示,要进行内存和内存之间的装换,即是字节和字节的装换。并放到一个字节里,通过网页输出。

        // 在内存中字节的转换

       ByteArrayOutputStreambos = newByteArrayOutputStream();

       ImageIO.write(bi,"JPEG", bos);

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

       ServletOutputStreamout = response.getOutputStream();

       out.write(buf);

 

(9)设置应答内容的长度

    response.setContentLength(buf.length);

(10)把输出的验证码存放到session中

    HttpSession session =request.getSession();

    session.setAttribute("checkCode",newString(rands));

 

最后的效果为:

   

 

补充:

重写URL,在禁用Cookie的时候用的方法

    encodeURL()方法

    encodeRedirectURL()方法

例子:

//对目标地址进行重写,系统会自动的在session4之后加上地址

       out.print("<ahref='"+response.encodeURL("session4")+"'>Servlet2</a>");

 

Cookie功能没有关闭

    url重写  :第一次提交请求,在请求消息没有包含sessionid

 

t;/�D�P:�                    <f:姓名></f: 姓名>

 

Schema的约束能力非常大,,可记性对属性非常细致的操作

 

Schema约束的快速入门

       Schema本身就是xml的文件,扩展名为xsd

       Schema的文档通常成为模式文档,遵循这个文档书写的xml文档成为实例文档

       Schema文档必须有一个根结点

             Schema:book.xsd     uri地址:把定义好的文档绑定到http://www.csdn..com网站上,是我们随便起的名字 

             Schema:book.xsd

                    

             Schema:book.xsd      http://www.csdn..com   前缀为book

             Xml文档

                    <book:书架></book:书架>  指定书架去遵循绑定的约束 

book代表的是http://www.csdn..com

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值