Servlet Session(httpsession)验证输入的验证码是否正确
用户在访问登录页面Login的时候,Login页面会去请求CreateCode这个Servlet生成验证码,然后显示在自己的页面上,然后再提交到LoginClServlet进行验证。很显然,访问Login和请求CreateCode这是从浏览器发出的两次不同的请求,所以,CreateCode产生的验证码字符串必须放入Session中,才能让LoginClServlet拿到,然后进行验证。
java结构
1. 生成验证码
//CreateCode.jsp public class CreateCode extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 7.禁止浏览器缓存随机图片 response.setDateHeader("Expires", -1); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); // 6.通知客户机以图片方式打开发送过去的数据 response.setHeader("Content-Type", "image/jpeg"); // 1.在内存中创建一幅图片 BufferedImage image = new BufferedImage(110, 30, BufferedImage.TYPE_INT_BGR); // 2.向图片上写数据 Graphics g = image.getGraphics(); // 设背景色 g.setColor(Color.white); g.fillRect(0, 0, 110, 30); String checkcode = ""; // 画5个验证码字符 for(int i=0;i<5;i++){ g.setColor(generateColor()); g.setFont(generateFont()); String str = generateStr(); checkcode += str; g.drawString(str,20*i,25); } // 画干扰点 for(int i=0;i<100;i++){ Random random = new Random(); int x = random.nextInt(110); int y = random.nextInt(30); g.setColor(generateColor()); g.fillOval(x, y, 2, 2); } // 画干扰线 for(int i=0;i<5;i++){ Random random = new Random(); int x1 = random.nextInt(110); int y1 = random.nextInt(30); int x2 = random.nextInt(110); int y2 = random.nextInt(30); g.setColor(generateColor()); g.drawLine(x1, y1, x2, y2); } // 这句话就是把随机生成的验证码,保存到session // 验证码不区分大小写,所以这里转为小写 request.getSession().setAttribute("checkcode", checkcode.toLowerCase()); // 5.把写好数据的图片输出给浏览器 ImageIO.write(image, "jpg", response.getOutputStream()); } /** * 生成随机字体 * @return */ public Font generateFont() { String[] font_names = new String[] { "Broadway", "方正姚体", "Footlight MT Light", "Sitka Text", "方正舒体", "幼圆" ,"Colonna MT"}; int[] font_styles = new int[]{Font.BOLD, Font.ITALIC, Font.BOLD|Font.ITALIC}; Random random = new Random(); int name_index = random.nextInt(font_names.length); int style_index = random.nextInt(font_styles.length); return new Font(font_names[name_index],font_styles[style_index],28); } /** * 生成随机颜色 * * @return */ public Color generateColor() { Random random = new Random(); return new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)); } /** * 生成随机数[0-9a-zA-Z] * * @return */ public String generateStr() { String[] nums = new String[62]; // 添加0-9这10个数字 for (int i = 0; i < 10; i++) { nums[i] = String.valueOf(i); } // 添加A-Z这26个大写字母 for (int i = 65; i < 91; i++) { nums[i - 55] = Character.toString((char) i); } // 添加a-z这26个小写字母 for (int i = 97; i < 123; i++) { nums[i - 61] = Character.toString((char) i); } // 产生一个随机数 Random random = new Random(); int index = random.nextInt(62); return nums[index]; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
2. 登录界面
out.println("<font color=white>验证码:<input type='text' name='checkcode'/><img src='/mycheckcode/CreateCode'>");
运行结果:
3. 校验验证码
//获取用户的id/password/输入的验证码 String id = request.getParameter("id"); String passwd = request.getParameter("passwd"); // 用户输入的验证码 String input_checkcode = request.getParameter("checkcode"); // 正确的验证码 String checkcode = (String)request.getSession().getAttribute("checkcode"); // 先看验证码对不对 if(input_checkcode.toLowerCase().equals(checkcode)){ // 验证码OK,再到数据库验证id和passwd }else{ request.setAttribute("error", "验证码有误"); request.getRequestDispatcher("/Login").forward(request, response); }
登录表单提交到LoginClServlet进行验证,它需要从参数中获取用户输入的验证码,再从Session中取出CreateCode这个Servlet放入Session中的正确的验证码.
版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。