`
flyduck
  • 浏览: 46588 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

输出验证码的jsp程序

阅读更多
 

<%@ page contentType="image/jpeg" import="javax.imageio.ImageIO,
                                          javax.servlet.ServletOutputStream,
                                          java.awt.*,
                                          java.awt.image.BufferedImage,
                                          java.io.IOException,
                                          java.util.Random" %><%!
  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);
  }
//  private int index = 0;

  Font getFont() {
    Random random = new Random();
    int index = random.nextInt(fontNames.length);
    String name = fontNames[index];
//    String name = fontNames[index++];
//    System.out.println("name = " + name);
    int style = random.nextInt(3);
    return new Font(name, style, 22);
  }

  String[] winFontNames = new String[]{
          "Arial", "Basemic", "Century", "Courier", "Dotum", "Garamond", "Gulim",
          "LiSu", "MingLiU", "Tahoma", "Times New Roman", "Verdana", "Serif.bold"
  };
  String[] linuxFontNames = new String[]{
          "Aharoni Book", "Baekmuk Dotum", "Bitstream Charter", "Courier", "David Medium",
          "Frank Ruehl Medium", "Luxi Mono Regular", "Monospaced.plain", "Nimbus Mono L Regular", "Serif.plain", "Utopia Regular"
  };
  String[] fontNames = System.getProperty("os.name").toLowerCase().indexOf("windows") > -1 ? winFontNames : linuxFontNames;
%><%
  //设置页面不缓存
  response.setHeader("Pragma", "No-cache");
  response.setHeader("Cache-Control", "no-cache");
  response.setDateHeader("Expires", 0);
//生成随机类
  Random random = new Random();

// 在内存中创建图象
  int width = 97 + random.nextInt(3), height = 25 + random.nextInt(3);
  BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// 获取图形上下文
  Graphics g = image.getGraphics();

// 设定背景色
  g.setColor(getRandColor(200, 250));
  g.fillRect(0, 0, width, height);

  g.setColor(Color.BLACK);
  g.drawRect(0, 0, width - 1, height -1);

//设定字体

//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);

// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
  g.setColor(getRandColor(160, 200));
  for (int i = 0; i < 217; 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 sRand = "";
  int len = 5;
  String refer = request.getHeader("Referer");

/*
    sRand = getGuid(len).toUpperCase();
  char[] chars = sRand.toCharArray();
  //(int) (Math.random() * 26D) + 65
*/
  g.setFont(getFont());
  for (int i = 0; i < len; i++) {
    char c = (char) (random.nextInt(26) + 65);
    String rand = String.valueOf(c);
    sRand += rand;
    // 将认证码显示到图象中
    g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
    //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
    g.drawString(rand, 8 + 16 * i + random.nextInt(5), 18 + random.nextInt(7));
  }

  g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
  int y1;
  int y2;
  if (random.nextInt(2) == 1) {
    y1 = random.nextInt(height / 2);
    y2 = height / 2 + random.nextInt(height / 2);
  } else {
    y1 = height / 2 + random.nextInt(height / 2);
    y2 = random.nextInt(height / 2);
  }
  g.drawLine(0, y1, width, y2);
//    g.drawLine(0, y1+1, width, y2+1);
//    g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
//    g.drawLine(random.nextInt(width/2),0,width/2+random.nextInt(width),height);

/*
  boolean hasYesky = false;
  if (refer != null && refer.trim().length() > 0) {
    String lower = refer.trim().toLowerCase();
    if (lower.indexOf("yesky.com") >= 0 || lower.indexOf("chinabyte.com") >= 0
            || lower.indexOf("cseek.com") >= 0 || lower.indexOf("myhard.com") >= 0) {
      hasYesky = true;
    }
  }
  if (!hasYesky) {
    sRand += " referError";
  }
*/

// 将认证码存入SESSION
  session.setAttribute("verify_code_session_key", sRand);

// 图象生效
  g.dispose();

// 输出图象到页面
  ServletOutputStream outputStream = null;
  try {
    outputStream = response.getOutputStream();
    ImageIO.write(image, "JPEG", outputStream);

  } finally {
    if (outputStream != null) {
      try {
        outputStream.close();
      } catch (IOException e) {
      }
    }
  }
%>

分享到:
评论

相关推荐

    验证码下载jsp

    &lt;title&gt;My JSP 'image.jsp' starting page ;charset=utf-8"&gt; &lt;meta http-equiv="expires" content="0"&gt; ,keyword2,keyword3"&gt; &lt;!-- --&gt; //设置页面不缓存 response.setHeader("Pragma","No-...

    登录注册彩色验证码刷新

    ②向客户端输出验证码图像,并将对应的验证码字符串保存到session中,然后在登录或者注册页面中通过 或者jsp程序"/&gt;标签加载图像,然后用户根据图像在文本框中输入对应的验证码字符串 ③获取用户输入的验证码字符串...

    采用ajax实现的图片验证码

    //1、得到dwr程序的上下文 WebContext cxt = WebContextFactory.get(); //2、利用上下文取得session HttpSession ses = cxt.getSession(); //3、从session中,取得在PicServlet中,存储的验证码信息 ...

    jsp生成验证码

    //给定范围获得随机颜色//设置页面不缓存// 在内存中创建图象//...//设定字体// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到 // 取随机产生的认证码(4位数字)// 将认证码存入SESSION // 输出图象到页面

    JSP实用技巧集合,jsp编程的一些小技巧总结

    100.将jsp应用程序打war包 101.实现投票系统 102.使用cookie记录用户访问次数? 103.使用session对象防止表单重复提交? 104.获取用户真实IP地址? 105.获取请求中的所有参数? 106.获取完整的请求URL? 107.在重新显示...

    jsp编程技巧集锦

    数字转中文 128 自动计算金额 129 JSP页面打印中使用WebBrowser控件 130 不刷新页面添加新的类别 131 鼠标滚动缩放图片 132 根据输入的表名生成输入数据表格 133 JSP表格输出到Excel 134.JSP...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    J2EE经典案例设计与实现

    案例2:JSP顺序输出查询结果 案例3:JSP逆序输出查询结果 案例4:JSP执行存储过程 案例5:J2EE访问Tomcat中的数据连接池 案例6:J2EE访问JBoss中数据连接池 案例7:J2EE访问WebLogic中的数据连接池 案例8:简单的...

    FreeMarke实例代码

    FreeMarker允许Java servlet保持图形设计同应用程序逻辑的...FreeMarker同样可以应用于非Web应用程序环境 FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库 FreeMarker是免费的

    常用的java工具类

    1.[工具类] 读取、打印输出、保存xml .java 2.[工具类] Java中计算任意两个日期之间的工作天数 .java 3.[工具类] MD5 .java ...9.[工具类] 验证码img .jsp 10.[工具类] 中文验证.jsp ......... 等等20几个常用工具类.

    java班级管理系统(论文+系统)

    由于java程序对各变量的大小写要求比较严格,所以在程序调试阶段花了不少时间,而且程序的运行环境为JDK1.4.2,图形界面的输出要编写大量的代码实现。如果在编程环境为JBuilder,可能会比较简洁一点。本设计使用SSH...

    30个java工具类

    [工具类] 验证码img .jsp.txt [工具类] Java中计算任意两个日期之间的工作天数 .java.txt [工具类] java抓取网页 .java.txt [工具类] MD5 .java.txt [工具类] MD5强化版 .java.txt [工具类] MD5超强化版 .java.txt ...

    【强2】30个java工具类

    [工具类] 验证码img .jsp.txt [工具类] Java中计算任意两个日期之间的工作天数 .java.txt [工具类] java抓取网页 .java.txt [工具类] MD5 .java.txt [工具类] MD5强化版 .java.txt [工具类] MD5超强化版 .java.txt ...

    Java范例开发大全 (源程序)

     实例190 验证码 322  11.3 Date类和Calendar类 324  实例191 使用Date类获取系统的当前时间 324  实例192 使用DateFormat类获取系统的当前时间 325  实例193 使用GregorianCalendar类获取系统的当前时间 ...

    Java范例开发大全(全书源程序)

    实例190 验证码 322 11.3 Date类和Calendar类 324 实例191 使用Date类获取系统的当前时间 324 实例192 使用DateFormat类获取系统的当前时间 325 实例193 使用GregorianCalendar类获取系统的当前时间 326 实例...

    s2mBlog 免费博客平台 v3.2.0

    s2mBlog 框架:SpringMvcMybatisFreemarkerLog4j2主要功能:基于captcha的图形验证码功能,可灵活配置;基于memcached缓存体系,可用于搭建高并发项目;严格按照 MVC 体系,将数据库体系、程序编码体系、前端页面...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

Global site tag (gtag.js) - Google Analytics