`
fastwind
  • 浏览: 325937 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Jsp常用功能1——图片验证码

阅读更多

图片验证码的实现主要的技术点是如何生成一个图片。生成图片可以使用java.awt包下的类来实现。我们先写一个简单的生成图片的程序HelloImage.java

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class HelloImage {
    public static void main(String[] args){
        BufferedImage image = new BufferedImage(80, 25,
                BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        g.setColor(new Color(255,255,255));
        g.fillRect(0, 0, 80, 25);
        g.setColor(new Color(0,0,0));
        g.drawString("HelloImage",6,16);
        g.dispose();
        try{
            ImageIO.write(image, "jpeg", new File("C:\\helloImage.jpeg"));
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

 

编译后,在DOS下调用这个程序,正常情况下,会在C盘根目录下生成一张名字helloImage.jpeg为的图片。图片上有文字HelloImage

 

简单介绍下生成图片的流程

  1. 建立BufferedImage对象。指定图片的长度宽度和色彩。
    BufferedImage image = new BufferedImage(80,25,BufferedImage.TYPE_INT_RGB);
  2. 取得Graphics对象,用来绘制图片。
    Graphics g = image.getGraphics();
  3. 绘制图片背景和文字。
  4. 释放Graphics对象所占用的资源。
    g.dispose();
  5. 通过ImageIO对象的write静态方法将图片输出。
    ImageIO.write(image, "jpeg", new File("C:\\helloImage.jpeg"));

知道了图片的生成方法,剩下的问题就是如何将随机数生成到页面上了。要显示图片,我们只要将生成的图片流返回给response对象,这样用户请求的时候就可以得到图片。而一个jsp页面的page参数的contentType属性可以指定返回的response对象的形式,我们平时的jsp页面中设定的contentType是text/html,所以会被以HTML文件的形式读取分析。如果设定为image/jpeg,就会被以图片的形式读取分析。确定了这点后就可以着手实现。

  1. 修改生成图片的类,添加生成随机字符串的方法,并取得用户传过来的response对象将图片流输出到response对象中。同时为了更友好和可订制,添加了一个构造函数,可以修改图片验证码的长度,以及验证码的码字范围。并且可以设定验证码的背景色。(用户使用时可以设定验证图片的背景色与页面的背景色相同)
  2. 写一个jsp文件,用来调用生成验证码图片的类。并得到生成的验证码,存入session。

以下是生成验证码图片的类RandImgCreater

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
public class RandImgCreater {
    private static final String CODE_LIST = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
    private HttpServletResponse response = null;
    private static final int HEIGHT = 20;
    private static final int FONT_NUM = 4;
    private int width = 0;
    private int iNum = 0;
    private String codeList = "";
    private boolean drawBgFlag = false;
    
    private int rBg = 0;
    private int gBg = 0;
    private int bBg = 0;
    public RandImgCreater(HttpServletResponse response) {
        this.response = response;
        this.width = 13 * FONT_NUM + 12;
        this.iNum = FONT_NUM;
        this.codeList = CODE_LIST;
    }
    
    public RandImgCreater(HttpServletResponse response,int iNum,String codeList) {
        this.response = response;
        this.width = 13 * iNum + 12;
        this.iNum = iNum;
        this.codeList = codeList;        
    }
    
    public String createRandImage(){
        BufferedImage image = new BufferedImage(width, HEIGHT,
                BufferedImage.TYPE_INT_RGB);
        
        Graphics g = image.getGraphics();
        
        Random random = new Random();
        
        if ( drawBgFlag ){
            g.setColor(new Color(rBg,gBg,bBg));
            g.fillRect(0, 0, width, HEIGHT);
        }else{
            g.setColor(getRandColor(200, 250));
            g.fillRect(0, 0, width, HEIGHT);
            
            for (int i = 0; i < 155; i++) {
                g.setColor(getRandColor(140, 200));
                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);
            }
        }
        
        g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
        
        String sRand="";
        for (int i=0;i<iNum;i++){
            int rand=random.nextInt(codeList.length());
            String strRand=codeList.substring(rand,rand+1);
            sRand+=strRand;
            g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
            g.drawString(strRand,13*i+6,16);
        }
        g.dispose();
        try{
            ImageIO.write(image, "JPEG", response.getOutputStream());
        }catch(IOException e){
            
        }
        
        return sRand;
    }
    
    public void setBgColor(int r,int g,int b){
        drawBgFlag = true;
        this.rBg = r;
        this.gBg = g;
        this.bBg = b;
    }
    private 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);
    }
}

 

以下是调用生成验证码图片的类的jsp文件:

 

<%@ page contentType="image/jpeg" %>
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
RandImgCreater rc = new RandImgCreater(response);
//RandImgCreater rc = new RandImgCreater(response,8,"abcdef");
//rc.setBgColor(100,100,100);
String rand = rc.createRandImage();
session.setAttribute("rand",rand);
%>

 

 

将java程序编译后得到的class,放到Tomcat自己的web应用的class的目录下,并写一个测试程序。

请求页面:

 

<form name="frm" method="post" action="chkImg.jsp">
Hello Image Test<br/>
checkCode:<img src="img.jsp"><br/>
please input the checkCode:<input type="text" name="code" value=""><br/>
<input type="submit" name="btn1" value="check">
</form>

 

 

验证页面:

<%
String inputCode = request.getParameter("code");
String code = (String)session.getAttribute("rand");
if ( inputCode.equals(code) ){
%>
check SUCCESS!!!!!
<%}else{%>
wrong code!!!!!!!
<%}%>

 

1.构造函数
    RandImgCreater提供了2个构造函数。
    默认的构造函数需要设定response对象。
    public RandImgCreater(HttpServletResponse response)
    使用这个构造函数的时候,生成4位验证码图片,验证码为大小写英文字母和数字中的随机组合。
    public RandImgCreater(HttpServletResponse response,int iNum,String codeList)
    使用这个构造函数的时候,iNum为指定的显示的验证码的位数,codeList为用户指定的验证码的生成元字符。(不支持中文)
    使用例
RandImgCreater rc = new RandImgCreater(response,8,"abcdef");
将会生成从abcdef中随机取出的8位验证码图片。

2.指定背景色
   public void setBgColor(int r,int g,int b)
   这个方法可选用。设定的时候,将会按照用户指定的背景色显示图片背景,不设定的时候将使用默认背景。
   r,g,b分别为RGB颜色中的各个色彩的设定值。取值范围为0-255
   使用例
   rc.setBgColor(100,100,100);

分享到:
评论

相关推荐

    Jsp常用功能——图片验证码

    本文将深入解析JSP中实现图片验证码的主要技术和步骤。 首先,我们需要理解如何生成一张图片。在Java中,我们可以利用`java.awt`包下的类来实现这一目标。`HelloImage.java`示例代码展示了生成图片的基本流程: 1....

    Jsp常用技巧:图片验证码

    在本案例中,我们将讨论如何使用JSP实现一个常见的功能——图片验证码。验证码的主要目的是防止自动化脚本或机器人对网站进行恶意操作,它通常要求用户输入图片上显示的一串随机字符。 图片验证码的生成涉及到几个...

    java工具类——验证码(VerifyCode)

    验证码(VerifyCode)是Web应用中常用的一种安全机制,用于防止自动化的机器人或者恶意脚本进行非法操作,比如注册、登录、评论等。在Java中,我们可以创建一个工具类来生成这种随机验证码,以增强系统安全性。下面...

    java《验证码——源代码》

    Java验证码技术是Web应用中常用的一种安全机制,用于防止自动化的机器人或恶意脚本进行非法操作,例如批量注册、恶意登录等。在这个示例中,我们看到一个简单的JSP实现的验证码系统,它包含了三个主要文件:`login....

    OFBiz 实践 ——百货购

    ### OFBiz 实践 —— 百货购 #### 一、为什么选择OFBiz? OFBiz是一种基于Java的企业级电子商务框架,被广泛应用于大型网站和分布式系统架构中。它以其强大的功能、灵活的扩展性和高质量的代码赢得了众多开发者的...

    JSP+—+Java+Web开发JSP+—+Java+Web开发

    学员将编写第一个JSP程序——"Hello World",并理解JSP文件的执行过程。课程还将对比静态HTML和动态JSP文件的区别。 **JSP内置对象** 课程的核心部分是JSP的内置对象,这些对象提供了与HTTP请求和响应交互的能力。...

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

    12.8.1 jsp文档的标识 404 12.8.2 jsp文档中的元素语法 404 12.9 小结 407 第13章 jsp与javabean 409 13.1 javabean简介 409 13.1.1 属性的命名 409 13.1.2 属性的类型 411 13.2 在jsp中使用javabean 412 ...

    JAVA WEB典型模块与项目实战大全

    6.2 网络硬盘功能具体实现——浏览磁盘和显示文件信息  6.3 网络硬盘功能具体实现——操作文件夹和文件  6.4 小结  第7章 网站统计模块(jsp+servlet)  7.1 网站统计模块原理  7.2 实现显示欢迎信息功能,...

    Java web手册

    1. **使用“记事本+Tomcat”方式编写一个简单的Web应用程序——HelloWorld** - 在本地磁盘创建一个项目目录,如`HelloWorld`。 - 使用记事本编辑HTML和Java代码。 - 配置Tomcat服务器来运行该应用。 2. **...

    Struts+Hibernate+自定义标签的网上书店

    在这个系统中,可能使用了图像验证码,要求用户输入图片中显示的一串随机字符,只有输入正确才能完成登录,从而增强了系统的安全性。 **5. 过滤器(Filter)** 在Web应用程序中,过滤器用于在请求到达目标资源之前...

    网站后台界面

    "JSP"(JavaServer Pages)是后台界面开发中常用的技术之一,它是一种动态网页开发标准,由Java技术提供支持。JSP允许开发者将HTML代码与Java代码混合编写,使得服务器端能够处理数据并生成响应的网页内容。这种技术...

    网上购书系统bookshop

    《网上购书系统bookshop——基于jsp+MySQL+Java的实现》 网上购书系统bookshop是一个典型的企业级Web应用程序,它集成了jsp、MySQL数据库和Java技术,为用户提供了一个方便快捷的在线购书平台。这个项目的实现充分...

    Javaweb项目源码大学生求职就业网.zip

    JavaWeb项目源码——大学生求职就业网是一个典型的Web应用程序,主要面向在校大学生和毕业生,提供求职招聘信息、个人简历投递、职位搜索等功能。这个项目基于Java技术栈开发,结合了前端展示、后端处理和数据库交互...

    JavaWeb网上图书商场完整项目(含相关素材文件)

    - 生成一次性图片验证码,增强系统的安全性。 #### 三、jQuery函数介绍 - **jQuery基础**:介绍jQuery的基本用法,如选择元素、修改样式等。 - **jQuery AJAX**:利用jQuery实现异步请求,提升用户体验。 #### 四...

    JAVA程序开发大全---上半部分

    20.11.1 后台管理模块的用户登录页面index.jsp 384 20.11.2 后台管理模块的首页面default.jsp 385 20.11.3 输入要添加的宠物信息的页面addPet.jsp 386 20.11.4 将宠物添加到系统中的页面addpet_do.jsp 387 20.11.5 ...

    基于Servlet+Spring+Mybatis的客户关系管理系统.zip

    此外,系统可能还集成了验证码、邮件发送、日志记录等实用功能。验证码防止恶意注册和登录,邮件服务用于发送通知或确认信息,日志记录有助于排查问题和性能优化。 总的来说,“基于Servlet+Spring+Mybatis的客户...

    基于JavaWeb的水果商城设计【论文】.doc

    JavaWeb是构建动态网站的一种常用技术栈,主要由Java Servlet、JSP(Java Server Pages)、JavaBean等技术组成。在本项目中,利用JavaWeb技术实现以下功能: - 用户认证与授权; - 动态页面渲染; - 业务逻辑处理;...

    基于J2ME和J2EE的手机银行设计与实现.rar

    《基于J2ME和J2EE的手机银行设计与实现》是针对移动金融服务的一种技术解决方案,它结合了Java平台的两个重要分支——J2ME(Java 2 Micro Edition)和J2EE(Java 2 Platform, Enterprise Edition)来构建安全、高效...

    Python模拟登陆实现代码

    掌握了这些基本步骤之后,便可以根据实际需求调整参数或增加更多的功能,例如处理验证码、处理重定向等。 以上便是关于Python模拟登录的具体实现方法,希望能够帮助读者更好地理解和应用这一技术。

Global site tag (gtag.js) - Google Analytics