image

 

regcode.jsp

<%@ page language="java" contentType="image/png"
    import="java.util.*,java.awt.*,java.awt.image.*" pageEncoding="GBK"%>
<%!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);
    }%>
<%
//将过期日期设置为一个过去时间
response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT"); // 设置 HTTP/1.1 no-cache 头
response.setHeader("Cache-Control", "no-store,no-cache,must-revalidate");
// 设置 IE 扩展 HTTP/1.1 no-cache headers, 用户自己添加
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
// 设置标准 HTTP/1.0 no-cache header.
response.setHeader("Pragma", "no-cache");
    out.clear();   
    //response.reset();// 清空以前缓冲区
    //生成随机类
    Random random = new Random();
    BufferedImage img = new BufferedImage(60, 20,
            BufferedImage.TYPE_INT_RGB);// 创建彩色缓冲图, 宽 60, 高 20
    Graphics g = img.getGraphics();// 画笔对象     // 填充白色的背景
    g.setColor(Color.white);
    g.fillRect(0, 0, 100, 20);
    //随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
    g.setColor(getRandColor(160, 200));
    for (int i = 0; i < 155; i++) {
        int x = random.nextInt(100);
        int y = random.nextInt(20);
        int xl = random.nextInt(12);
        int yl = random.nextInt(12);
        g.drawLine(x, y, x + xl, y + yl);
    }
    // 绘制蓝色文字
    g.setColor(Color.blue);
    // 生成 4 位随机数字验证码并存入session, 然后输出到图片中
    String code = "";
    for(int i = 0; i < 4; i++) {
        Random rand = new Random();
        // code += rand.nextInt(10) + ""; // 随机数字
        code += (char) ( rand.nextInt(26) + ‘A’) ; // 随机字母
    }
    session.setAttribute("regcode", code);// 存放值名字为 regcode     //设定字体
    g.setFont(new Font("Times New Roman", Font.PLAIN, 20));
    g.drawString(code, 2, 16);     g.dispose();// 关闭对象, 释放内存, 刷新到图形对象     out.clearBuffer();// 清空缓冲区
    javax.imageio.ImageIO.write(img, "png", response.getOutputStream());// 把内存的图片编码到输出流, 参数依次为: 图片对象, 格式(png,jpg), 输出流
    out.flush(); // 输出全部内容, 防止 Tomcat 后台报 Socket 错误, IE 6 下会出现问题
    //out.close();// 关闭, 防止后台无法写入数据
%>

对应的表单:

form.jsp

<%@ page pageEncoding="GBK" contentType="text/html; charset=GBK" %>
</font> <form method=post action="form_action.jsp">
<a href="javascript:void(0);"
onclick="loadNewCode(); return false;"
>看不清楚?换一张</a>
<input type=submit >
</form>
</body>

后台处理示例代码:

form_action.jsp

<%@ page pageEncoding="GBK" %> 您输入的验证码是:
<%=request.getParameter("keycode")%>
<%
String codeSession =  (String)session.getAttribute("regcode");
session.removeAttribute("regcode"); // 清空验证码, 防止重复提交 if(codeSession != null && codeSession.equals(request.getParameter("keycode") ) ) {
    out.println("正确");
} else {
    out.println("错误");
}
%>

转载请注明:WebLogic Android 博客 » JSP 生成随机验证码图片(Code Share)