前段时间赶着结束毕业设计任务,现在完成了。回来补一下设计毕业设计的过程中遇到的问题和解决方案。
为了使小系统更有模有样,这里尝试在登录页面实现验证码功能。现描述一下我的解决方案。
首先看一下实现后的界面:只要点击一下图片就可以刷新一次验证码,只有正确输入验证码后才能继续正常的登录操作,不区分大小写。
直接上代码
首先在index.jsp页面验证码相应代码:
1 <input type="text" id="checkCode"name="checkCode" style="width:100px" /> <a 2 href="javascript:reloadCode()"> <img alt="验证码" 3 id="imagecode" src="ServletDemo4" />
同样,在登录页面引入javascript小函数负责验证码切换的功能
<script type="text/javascript" language="javascript"> function reloadCode() {//切换验证码 var time = new Date().getTime(); document.getElementById("imagecode").src = "ServletDemo4?d=" + time; } </script>
接下来是后台绘画验证码的java代码:(详细代码描述见注释,这里不赘述)
这里主要应用了BufferedImage 类功能,它可以创建一个图像缓存区,并且在这基础上可以按我们的想法对其进行操作
1 package management; 2 3 import java.awt.Color; 4 import java.awt.Graphics; 5 import java.awt.image.BufferedImage; 6 import java.io.IOException; 7 import java.util.Random; 8 9 import javax.imageio.ImageIO; 10 import javax.servlet.annotation.WebServlet; 11 import javax.servlet.http.HttpServlet; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletResponse; 14 @WebServlet(name = "ServletDemo4", urlPatterns = { "/ServletDemo4" }) 15 public class ServletDemo4 extends HttpServlet { 16 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { 17 //这个方法实现验证码的生成 18 BufferedImage bi = new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB);//创建图像缓冲区 19 20 Graphics g = bi.getGraphics(); //通过缓冲区创建一个画布 21 22 Color c = new Color(255, 255, 255); //创建颜色 23 /*根据背景画了一个矩形框 24 */ 25 g.setColor(c);//为画布创建背景颜色 26 27 g.fillRect(0, 0, 68, 22); //fillRect:填充指定的矩形 28 // X和Y用于指定矩形左上角也就是相对于原点的位置,width和height用于指定矩形的宽和高。 29 30 char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();//转化为字符型的数组 31 Random r = new Random(); 32 int len = ch.length; 33 int index; //index用于存放随机数字 34 StringBuilder sb = new StringBuilder(); 35 for (int i = 0; i < 4; i++) { 36 index = r.nextInt(len);//产生随机数字 37 g.setColor(new Color(r.nextInt(88), r.nextInt(188), r.nextInt(255))); //设置颜色随机 38 g.drawString(ch[index] + "", (i * 15) + 3, 18);//画数字以及数字的位置 39 sb.append(ch[index]); 40 } 41 request.getSession().setAttribute("piccode", sb.toString()); //将数字保留在session中,便于后续的使用 42 ImageIO.write(bi, "JPG", response.getOutputStream()); 43 } 44 }
接下来是loginservlet中关于验证码处理的核心代码:
1 /*获取验证码与用户输入的验证码数据*/ 2 String piccode = (String) request.getSession().getAttribute("piccode"); 3 String checkCode = request.getParameter("checkCode"); //取值 4 checkCode=checkCode.toUpperCase(); //把字符串中的字母全部转换为大写
使用:
只需要比对输入的字符串是否和session保存的piccode相同即可实现验证码的功能
if (checkCode.equals(piccode)) {//满足即输入验证码正确 。。。。 }