`
flyduck
  • 浏览: 47761 次
  • 性别: 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+servlet编写的验证码程序

    在doGet方法中,我们使用了HttpServletResponse对象来输出验证码图片。该对象将图片输出到浏览器中,以便用户可以看到验证码。 三、验证码生成流程 该验证码生成流程可以分为以下几个步骤: 1. 首先,用户请求...

    JSP验证码登录程序

    **JSP验证码登录程序详解** 验证码(CAPTCHA)是一种用于防止自动机器人或恶意脚本进行非法操作的安全机制,常用于用户登录、注册等场景。在JSP(Java Server Pages)中,结合Servlet实现验证码功能,可以有效提升...

    JSP实现的验证码, 验证码

    在给定的压缩包文件中,`code.jsp`可能是生成验证码的页面,它包含了生成和输出验证码图像的逻辑。`validate.jsp`可能是处理用户输入并验证验证码的页面,它会检查用户输入的验证码是否正确。而`index.jsp`可能是...

    JSP生成数字验证码程序例子

    在这个"JSP生成数字验证码程序例子"中,我们将探讨如何利用JSP来生成一种常见的安全机制——数字验证码。 验证码的主要目的是防止自动化程序(如机器人或爬虫)进行非法操作,比如注册、登录或提交表单。它们通常...

    jsp图形验证码源码

    - 一个JSP文件(例如:`captcha.jsp`),负责生成和输出验证码图片流。 - 可能有一个辅助的Java类(如`CaptchaGenerator.java`),包含了生成随机字符串和绘制图像的逻辑。 - 配合使用的session管理,用于存储和比较...

    JSP 随机验证码

    - **字体混搭**:使用不同字体和大小的数字,使得验证码更难被自动化程序识别。 总的来说,JSP生成的数字验证码结合了Java的强大功能和网页的交互性,提供了一种简单而有效的用户验证方法。在开发过程中,确保...

    jsp 详细讲解 如何加入验证码

    // 输出验证码图像 response.setContentType("image/jpeg"); OutputStream out = response.getOutputStream(); ImageIO.write(image, "JPEG", out); out.flush(); out.close(); %&gt; ``` 在实际应用中,我们还...

    jsp 验证码(servlet)

    验证码是一种常用的安全机制,用于防止自动化的恶意程序,如机器人,进行非法操作。在Web开发中,JSP(JavaServer Pages)与Servlet结合使用可以实现动态生成并验证验证码的功能。这个小例子提供了一种简单易用的...

    验证码生成jsp 代码

    验证码是网络应用中常见的一种安全机制,用于防止自动机器人或者恶意程序进行非法操作,比如注册、登录、提交表单等。在本主题中,我们主要关注的是如何在Java服务器页面(JSP)中生成验证码。JSP是Java Web开发中的...

    JSP 数字验证码 实现方法

    总的来说,这个JSP数字验证码的实现是一个基本的示例,它展示了如何利用Java图形库在服务器端生成和输出验证码图像。在实际项目中,可能需要根据具体需求进行优化和扩展,例如增加字母、特殊字符的组合,或者使用更...

    jsp登入界面添加验证码

    4. **显示验证码**:将验证码图像以JPEG或PNG格式输出到客户端。在JSP页面中,我们可以创建一个`&lt;img&gt;`标签,其`src`属性指向一个Servlet,该Servlet负责生成并返回验证码图像。 5. **处理登录请求**:在登录表单...

    验证码程序

    `&lt;img src="random.jsp"&gt;`语句表示从服务器请求名为`random.jsp`的JSP页面,该页面负责生成验证码图像,并将其作为响应返回,从而在网页上显示验证码。 ### 核心知识点总结 - **随机字符串生成**:利用`...

    jsp彩色验证码完整源程序

    ### JSP 彩色验证码完整源程序解析 #### 一、概述 JSP(JavaServer Pages)是一种基于Java技术的动态网页技术标准,它通过在传统的静态HTML代码中嵌入Java代码片段(Scriptlets)、表达式(Expressions)以及声明...

    jsp验证码图片例子

    7. **将验证码和图片发送到客户端**:在JSP页面中,将生成的验证码字符串存储在session中,同时将图片以流的形式输出到HTTP响应中。客户端接收到图片后显示在网页上,用户输入看到的验证码。 8. **验证用户输入**:...

    JSP编写的四位验证码

    本示例展示了如何使用JSP技术结合Java图形处理API生成并输出四位数字的验证码。通过理解并掌握这些关键技术点,开发者可以构建出更为安全和用户友好的网站登录或表单提交系统。此外,通过调整颜色、形状和算法,还...

    jsp 处理验证码的步骤

    在IT行业中,尤其是在Web开发领域,验证码是一种广泛用于防止恶意自动程序(如机器人)进行非法操作的安全机制。验证码的主要目标是验证用户是否为人类,确保数据提交的真实性和安全性。本篇文章将详细介绍使用JSP...

    JSP实现验证码数字图片

    **JSP实现验证码数字图片详解** 验证码是一种常用的安全机制,用于防止自动机器人或者恶意脚本进行非法操作,如批量注册、频繁提交等。在Web开发中,JSP(JavaServer Pages)可以用来创建动态验证码图片。本文将...

    图形验证码(jsp实现)

    图形验证码要求用户在输入框中正确识别并输入图片上显示的一组随机字符,以此验证用户是真人而非计算机程序。在本主题中,我们将深入探讨如何使用JavaServer Pages (JSP) 技术来实现图形验证码的生成和验证。 1. **...

    jsp java 生成中文验证码

    在IT领域,生成验证码(CAPTCHA)是一种广泛用于防止恶意自动化程序(如机器人或爬虫)的手段。验证码通常由一串随机字符组成,用户需要输入显示的图像中的字符以证明他们是人类。在这个场景中,我们关注的是在JSP...

    JSP代码实现验证码功能

    - **添加干扰元素**: 在图片上随机添加一些干扰点,使得其他程序难以识别验证码。 - **输出图片**: 将最终的图片输出到客户端浏览器。 ```jsp *, java.awt.image.*, java.util.*, javax.imageio.*" %&gt; // 图片尺寸...

Global site tag (gtag.js) - Google Analytics