JSP实例:彩色验证码

本例使用一个JavaBean,名为Image.java,包com.zempty.bean下;

三个JSP文件,分别为image.jsp、login.jsp、check.jsp。其中login.jsp是登录页,image.jsp用来调用JavaBean显示图片,check.jsp用来检测输入的验证码是否正确。

Image.java代码如下:

package com.zempty.bean;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;

import javax.imageio.ImageIO;

public class Image {
    // 验证码图片中可以出现的字符集,可根据需要修改
    private char mapTable[] = { ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘, ‘h‘, ‘i‘,
            ‘j‘, ‘k‘, ‘l‘, ‘m‘, ‘n‘, ‘o‘, ‘p‘, ‘q‘, ‘r‘, ‘s‘, ‘t‘, ‘u‘, ‘v‘,
            ‘w‘, ‘x‘, ‘y‘, ‘z‘, ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘,
            ‘9‘ };

    /**
     * 功能:生成彩色验证码图片 参数width为生成图片的宽度,参数height为生成图片的高度,参数os为页面的输出流
     */
    public String getCertPic(int width, int height, OutputStream os) {
        if (width <= 0)
            width = 60;
        if (height <= 0)
            height = 20;
        BufferedImage image = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        // 获取图形上下文
        Graphics g = image.getGraphics();
        // 设定背景色
        g.setColor(new Color(0xDCDCDC));
        g.fillRect(0, 0, width, height);
        // 画边框
        g.setColor(Color.BLACK);
        g.drawRect(0, 0, width - 1, height - 1);
        // 取随机产生的认证码
        String strEnsure = "";
        for (int i = 0; i < 4; ++i) {
            strEnsure += mapTable[(int) (mapTable.length * Math.random())];
        }
        // 将认证码显示到图像中,如果要生成更多位的验证码,增加drawString语句
        g.setColor(Color.BLACK);
        g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
        String str = strEnsure.substring(0, 1);
        g.drawString(str, 8, 17);
        str = strEnsure.substring(1, 2);
        g.drawString(str, 20, 15);
        str = strEnsure.substring(2, 3);
        g.drawString(str, 35, 18);
        str = strEnsure.substring(3, 4);
        g.drawString(str, 45, 15);
        // 随机产生10个干扰点
        Random rand = new Random();
        for (int i = 0; i < 10; i++) {
            int x = rand.nextInt(width);
            int y = rand.nextInt(height);
            g.drawOval(x, y, 1, 1);
        }
        // 释放图形上下文
        g.dispose();
        try {
            // 输出图像到页面
            ImageIO.write(image, "JPEG", os);
        } catch (IOException e) {
            System.out.println(e.getMessage());
            return "";
        }
        return strEnsure;
    }
}

image.jsp代码如下:

<%--注意:contentType为image/jpeg--%><%@ page contentType="image/jpeg" pageEncoding="UTF-8"%>

<jsp:useBean id="image" class="com.zempty.bean.Image" scope="session" />
<%
    String str = image.getCertPic(0, 0, response.getOutputStream());
    //将验证码存入session
    session.setAttribute("certCode", str);
    out.clear();  //这句和下面那句要加上,否则会出现getOutputStream() has already been called for this response的错误。
    out = pageContext.pushBody();
%>

login.jsp代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录页面</title>
</head>
<body>
    <form name="form1" action="check.jsp" method="post">
        用户名:<input type="text" name="username" /> <br /> 密&nbsp;&nbsp;码:<input
            type="password" name="password" /> <br /> 验证码:<input type="text"
            name="certCode" /><img src="image.jsp" /> <br /> <input
            type="submit" value="确定" />
    </form>
</body>
</html>

check.jsp代码如下:

<%@ page pageEncoding="UTF-8"%>

<%
    String certCode = request.getParameter("certCode");
    if (certCode.equals((String) session.getAttribute("certCode"))) {
        out.print("验证码输入正确!");
    } else {
        out.print("验证码输入错误!");
    }
%>

演示界面如下:

时间: 2024-10-13 01:53:55

JSP实例:彩色验证码的相关文章

英文,数字和中文混合的彩色验证码实现

功能描述:英文,数字和中文混合的彩色验证码是一种比较安全的验证码,虽然这样的验证码会给用户输入带来不便,但对于保障用户账号的安全还是值得的.本实例介绍实现英文,数字和中文混合验证码的彩色验证码的方法,输入用户名和密码后,还需要输入正确的验证码才可以正常登陆.由于验证码是随机生成的,可能会产生看不清楚的验证码,因此添加了重新生成验证码的功能,用户单击"看不清?换一个"超级链接和图片本身,可以重新生成一个验证码. 1:编写生成英文,数字和中文混合的彩色验证码的Servlet实现类 要生成英

JSP中使用验证码

本例子示范在用户登录页面中使用验证码,验证码使用javabena和servlet生成如下: MakeCertPic.java package cert; import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.io.OutputStream;import java.ut

编写生成彩色验证码的Servlet

利用Ajax实现无刷新的彩色验证码时,也需要编写一个名称为PictureCheckCode.java的Servlet,该类继承HttpServlet,主要通过service()方法生成验证码. 下面将介绍在service()方法中生成彩色验证码的具体过程. (1)设置响应头信息并指定生成的响应是JPG图片,具体代码 //禁止缓存 response.setHeader("Pragma", "No-cache"); response.setHeader("Ca

JSP+servlet生成验证码并验证

生成验证码的基本过程是: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ page import="java.awt.*,java.awt.image.BufferedImage,javax.imageio.ImageIO" %> <% response.setHeader("Cache-C

jsp动态生成验证码详细代码

思路:页面加载时执行fnGetcode()方法,获取验证码所有信息:点击“点击图片更换” 再次执行fnGetcode()方法: 1):<body > <label>         验证码:         <input id="showco" type="hidden" value=""/>         <input type="text" id="code"

JSP动态生成验证码

(1)在登录应用中,为防止恶意登录,常常需要服务器动态生成验证码并存储在session作用范围中,最后以图像形式返回给客户端显示 (2)下边的代码实现的功能:写一个JSP页,动态生成一个验证码,存储在session作用范围内,并以图像形式返回给客户端显示. 另写一个JSP页面,引用此JSP页面生成的验证码: authen.jsp代码如下: <%@ page import="java.awt.*,java.awt.image.*,java.util.*,com.sun.image.codec

JSP+Servlet实现验证码生成

主要利用JSP+Servlet实现验证码生成 利用JQuery的ajax技术实现异步更换图片地址 BufferedImage实现验证码图片的生成 Servlet代码: package Register; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOEx

jsp登陆页面验证码在火狐浏览器不能刷新问题处理方案

jsp登陆页面在火狐浏览器验证码不能刷新问题处理方案: <img src="YzmServlet" onClick="this.src='YzmServlet?time='+new Date()" width="59" height="20" style="width: 86px; height: 25px"> 关键代码:?time='+new Date() 如果不加入以上关键代码部分会导致在不

jsp实例

使用jsp在首页当中,做一个简单的网页计数器. <% if(application.getAttribute("content") == null){ application.setAttribute("content", 1); } else{ String count = application.getAttribute("content").toString(); int icount = Integer.valueOf(count)