Java简单验证码原理(源代码+步骤操作) 您所在的位置:网站首页 Java滑块验证码原理和实现 Java简单验证码原理(源代码+步骤操作)

Java简单验证码原理(源代码+步骤操作)

2024-07-02 16:58| 来源: 网络整理| 查看: 265

实现思路:

通过Java后台的ImageIO生成验证码;js获取验证码,并展示;提交form表单,后台servlet校验验证码;

1、新建名为:CheckCodeServlet的servlet类,代码如下:

package com.seesun2012.Servlet; //这里是我的包名 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 生成验证码 **/ public class CheckCodeServlet extends HttpServlet { //产生随即的字体 private Font getFont() { //创建random对象用来生成随机数 Random random = new Random(); //创建字体数组,用来装不同的字体的Font对象 Font font[] = new Font[5]; font[0] = new Font("Ravie", Font.PLAIN, 24); font[1] = new Font("Antique Olive Compact", Font.PLAIN, 24); font[2] = new Font("Forte", Font.PLAIN, 24); font[3] = new Font("Wide Latin", Font.PLAIN, 24); font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 24); return font[random.nextInt(5)]; } protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置响应头 Content-type类型 resp.setContentType("image/jpeg"); OutputStream os = resp.getOutputStream(); int width = 83, height = 30; // 建立指定宽、高和BufferedImage对象 BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); // 该画笔画在image上 Color c = g.getColor(); // 保存当前画笔的颜色 //填充矩形 g.fillRect(0, 0, width, height); char[] ch = "abcdefghjkmnpqrstuvwxyz2345678901".toCharArray(); // 随即产生的字符串 不包括 i l(小写L) o(小写O) 1(数字1)0(数字0) int length = ch.length; // 随即字符串的长度 String sRand = ""; // 保存随即产生的字符串 Random random = new Random(); for (int i = 0; i < 4; i++) {     // 设置字体 g.setFont(getFont()); // 随即生成0-9的数字 String rand = new Character(ch[random.nextInt(length)]).toString(); sRand += rand; // 设置随机颜色 g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255))); g.drawString(rand, 20 * i + 6, 25); } //产生随即干扰点 for (int i = 0; i < 20; i++) { int x1 = random.nextInt(width); int y1 = random.nextInt(height); g.drawOval(x1, y1, 2, 2); } // 将画笔的颜色再设置回去 g.setColor(c); // 释放此图形的上下文以及它使用的所有系统资源。 g.dispose(); //将验证码记录到session req.getSession().setAttribute("safecode", sRand); // 输出图像到页面 ImageIO.write(image, "JPEG", os); } protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }

2、在页面中JSP页面中添加如下JavaScript代码(前提必须引用jquery-1.11.0.min.js脚本):

// js获取验证码,并展示 function changeImg() {     var imgObj = document.getElementById("img");     imgObj.src = "CheckCodeServlet?ran=" + Math.random(); }

3、在body标签中的添加,post为提交方式:

    验证码:               看不清楚,换张图片

4、通过文本框的name属性,在Servlet中获取页面传过来的值,代码如下:

package com.seesun2012.Servlet; //这里是我的包名 import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 后台登陆校验(包含验证码校验) **/ public class UserInfoManager extends HttpServlet {     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {         //获取页面传过来的参数(验证码)         String code=request.getParameter("code"); //这里的“code”为 中的name属性名         System.out.println(code);//控制台打印传过来的code值         HttpSession session=request.getSession();//初始化Session         String sessionCode=(String)session.getAttribute("safecode");//获取的验证码         System.out.println(sessionCode);//打印从CheckCodeServlet 类获取随即生成的验证码参数         //判断用户输入的验证码与随机产生的验证码是否对应         if (!(sessionCode.equals(code))) {             //验证验证码不正确的情况             request.setAttribute("msg", "对不起验证码不正确");//提示内容             request.getRequestDispatcher("login.jsp").forward(request, response);//如果不正确返回一个提示(msg)给页面,在login.jsp页面利用${msg}显示提示         } else {             //验证成功             String msg=request.getParameter("account");             request.setAttribute("msg",msg);             session.setAttribute("account", account);             //页面跳转             request.getRequestDispatcher("admin.jsp").forward(request, response);             System.out.println("登陆成功!"); //控制台测试是否登录成功!         }     } }

 

 

 

 

注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除! __________________________________________________________________________________________________

持续更新中......

 如有对思路不清晰或有更好的解决思路,欢迎与本人交流,QQ群:273557553,个人微信:

你遇到的问题是小编创作灵感的来源!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有