zoukankan      html  css  js  c++  java
  • 怎样用java实现验证码

    转自:http://www.cdtarena.com/javapx/201306/8796.html

      现在许多系统的注册、登录或者发布信息模块都添加的随机验证码功能,就是为了避免自动注册程序或者自动发布程序的使用。
      验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效。为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加自动识别验证码的难度。
      在这里,我们使用java实现验证码。
      <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
      <%!
      Color getRandColor(int fc,int bc){//给定范围获得随机颜色
      Random random = new Random();
      if(fc>255) fc=255;
      if(bc>255) bc=255;
      int r=fc+random.nextInt(bc-fc);
      int g=fc+random.nextInt(bc-fc);
      int b=fc+random.nextInt(bc-fc);
      return new Color(r,g,b);
      }
      %>
      <%
      //设置页面不缓存http://www.cdtarena.com/3g.html
      response.setHeader("Pragma","No-cache");
      response.setHeader("Cache-Control","no-cache");
      response.setDateHeader("Expires", 0);
      // 在内存中创建图象
      int width=60, height=20;
      BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
      // 获取图形上下文
      Graphics g = image.getGraphics();
      //生成随机类
      Random random = new Random();
      // 设定背景色
      g.setColor(getRandColor(200,250));
      g.fillRect(0, 0, width, height);
      //设定字体
      g.setFont(new Font("Times New Roman",Font.PLAIN,18));
      // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
      g.setColor(getRandColor(160,200));
      for (int i=0;i<155;i++)
      {
      int x = random.nextInt(width);
      int y = random.nextInt(height);
      int xl = random.nextInt(12);
      int yl = random.nextInt(12);
      g.drawLine(x,y,x+xl,y+yl);
      }
      // 取随机产生的认证码(4位数字)
      String codeList = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
      String sRand="";
      for (int i=0;i<4;i++){
      int a=random.nextInt(codeList.length()-1);
      String rand=codeList.substring(a,a+1);
      sRand+=rand;
      // 将认证码显示到图象中
      g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
      g.drawString(rand,13*i+6,16);
      }
      // 将认证码存入SESSION
      session.setAttribute("rand",sRand);
      // 图象生效
      g.dispose();
      // 输出图象到页面
      ImageIO.write(image, "JPEG", response.getOutputStream());
      out.clear();
      out = pageContext.pushBody();
      %>

  • 相关阅读:
    ubuntu下使用sudo 出现unable to resolve host 解决方法
    Ubuntu下使用mysqli-connect连接mysql时报错:ERROR 1698 (28000): Access denied for user 'root'@'localhost'
    Ubuntu下安装LNMP之独立添加php扩展模块
    Ubuntu下安装LNMP之Mysql的安装及卸载
    Ubuntu下安装LNMP之php7的安装并配置Nginx支持php及卸载php
    Ubuntu使用vim编辑器时出现上下左右键变成ABCD
    Ubuntu下安装LNMP之nginx的卸载
    Ubuntu下使用find / -name aaa* 提示“find: 路径必须在表达式之前: XXXX”
    Ubuntu下安装LNMP之nginx的安装
    ubuntu使用su切换root用户提示“认证失败”
  • 原文地址:https://www.cnblogs.com/cdtarena/p/3123965.html
Copyright © 2011-2022 走看看