登陆注册时的验证码实现

来源:互联网 发布:mysql数据库的安装 编辑:程序博客网 时间:2024/05/16 10:18

    网上登录注册的时候一般会生成一个验证码,输入验证,怎么实现的呢?下面实现以下

大概步骤:后台生成验证码图片,显示在前台,把验证码存入session

1:生成验证码的代码

           

public class Controller extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {getRandcode(request,response);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}public static final String CHECKCODE = "CHECKCODE";// 放到session中的keyprivate Random random = new Random();private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机产生的字符串private int width = 80;// 图片宽private int height = 26;// 图片高private int lineSize = 40;// 干扰线数量private int stringNum = 4;// 随机产生字符数量/* * 获得字体 */private Font getFont() {return new Font("Fixedsys", Font.CENTER_BASELINE, 18);}/* * 获得颜色 */private Color getRandColor(int fc, int bc) {if (fc > 255) {fc = 255;}if (bc > 255) {bc = 255;}int r = fc + random.nextInt(bc - fc - 16);int g = fc + random.nextInt(bc - fc - 14);int b = fc + random.nextInt(bc - fc - 18);return new Color(r, g, b);}/** * 生成随机图片 */public void getRandcode(HttpServletRequest request, HttpServletResponse response) {HttpSession session = request.getSession();// BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作g.fillRect(0, 0, width, height);g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));g.setColor(getRandColor(110, 133));// 绘制干扰线for (int i = 0; i <= lineSize; i++) {drowLine(g);}// 绘制随机字符String randomString = "";for (int i = 1; i <= stringNum; i++) {randomString = drowString(g, randomString, i);}session.removeAttribute(CHECKCODE);session.setAttribute(CHECKCODE, randomString); // 将验证码写入session// System.out.println(randomString);g.dispose();ServletOutputStream sos = null;try {sos = response.getOutputStream();ImageIO.write(image, "JPEG", sos);// 将内存中的图片通过流动形式输出到客户端} catch (Exception e) {e.printStackTrace();} finally {if (sos != null) {try {sos.close();} catch (IOException e) {e.printStackTrace();}}}}/* * 绘制字符串 */private String drowString(Graphics g, String randomString, int i) {g.setFont(getFont());g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)));String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));randomString += rand;g.translate(random.nextInt(3), random.nextInt(3));g.drawString(rand, 13 * i, 16);return randomString;}/* * 绘制干扰线 */private void drowLine(Graphics g) {int x = random.nextInt(width);int y = random.nextInt(height);int xl = random.nextInt(13);int yl = random.nextInt(15);g.drawLine(x, y, x + xl, y + yl);}/* * 获取随机的字符 */public String getRandomString(int num) {return String.valueOf(randString.charAt(num));}}
前台页面代码
<body><form action="com/zhihua/tijiao.do" method="post"><!-- 这是提交验证码的请求地址--><img alt="" src="com/zhihua/getimage.do"><!-- 这是获取验证码的请求地址--><input type="text" name="yanzhengma"><input type="submit" value="提交"></form></body>

接收验证码的后台代码,另外一个controller类

@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String yanzhengma = request.getParameter("yanzhengma");String sessionYanzhengma = (String) request.getSession().getAttribute("CHECKCODE");System.out.print("这是session里的验证码"+sessionYanzhengma);if (yanzhengma.equals(sessionYanzhengma)) {System.out.println("验证码正确");} else {System.out.println("验证码不正确");}}
在controller类里已经把验证码字符串存入session中,在验证类里课直接获取,校验从前端发送的验证码是否正确