zoukankan      html  css  js  c++  java
  • 制作验证码

    image.jsp

    <%@page import="java.net.URL" %>
    <%@page import="java.io.InputStream" %>
    <%@ page language="java" import="java.util.*" pageEncoding="gbk" %>
    <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
    <%!
    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);
    }
    %>
    <%
    out.clear();
    //设置页面不缓存
    response.setHeader("Pragma", "No-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);

    // 在内存中创建图象
    int width = 70, height = 30;
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

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

    //生成随机类
    Random random = new Random();

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

    //设定字体
    g.setFont(new Font("宋体", Font.PLAIN, 18));
    //g.setFont(new Font("Tahoma",Font.PLAIN,18));
    //URL url = new URL("http://127.0.0.1:8080/crm/resource/font/SIMSUN.TTC");
    //InputStream is = url.openStream();
    /* InputStream is = this.getClass().getClassLoader().getResourceAsStream("COURI.TTF");

    System.out.println(is);
    Font f = Font.createFont(Font.PLAIN, is); */
    //f.deriveFont(30);
    /* f.deriveFont(Font.PLAIN, 18);
    is.close();
    g.setFont(f); */

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

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

    char[] cs = new char[]{'1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'A', 'B', 'M'};

    // 取随机产生的认证码(4位数字)
    String sRand = "";
    for (int i = 0; i < 4; i++) {
    char c = cs[random.nextInt(cs.length)];//[0,4)
    String rand = new Character(c).toString();
    sRand += rand;
    // 将认证码显示到图象中
    g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
    //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
    //g.drawString(rand, 13 * i + 6, 16);
    g.drawString(rand, 13 * i + 6, 20);
    }

    // 将认证码存入session
    session.setAttribute("rand", sRand); //这行代码使我们关注的重点
    // 图象生效
    g.dispose();

    // 输出图象到页面
    try {
    ImageIO.write(image, "JPEG", response.getOutputStream());
    } catch (Exception e) {
    e.getMessage();
    } finally {

    //解决以调用错误
    out = pageContext.pushBody();

    }
    %>

  • 相关阅读:
    Codeforces Round #649 (Div. 2) D. Ehab's Last Corollary
    Educational Codeforces Round 89 (Rated for Div. 2) E. Two Arrays
    Educational Codeforces Round 89 (Rated for Div. 2) D. Two Divisors
    Codeforces Round #647 (Div. 2) E. Johnny and Grandmaster
    Codeforces Round #647 (Div. 2) F. Johnny and Megan's Necklace
    Codeforces Round #648 (Div. 2) G. Secure Password
    Codeforces Round #646 (Div. 2) F. Rotating Substrings
    C++STL常见用法
    各类学习慕课(不定期更新
    高阶等差数列
  • 原文地址:https://www.cnblogs.com/hwgok/p/5890264.html
Copyright © 2011-2022 走看看