彩色字体验证码



package com.fit;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class CheckCode
 */
public class CheckCode extends HttpServlet {
 private static final long serialVersionUID = 1L;
      
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CheckCode() {
        super();
        // TODO Auto-generated constructor stub
    }

    private Color getRandColor(int s, int e) { 
        Random random = new Random(); 
        if (s > 255) 
            s = 255; 
        if (e > 255) 
            e = 255; 
        int r = random.nextInt(e - s) + s; // 随机生成RGB中的R值 
        int g = random.nextInt(e - s) + s; // 随机生成RGB中的G值 
        int b = random.nextInt(e - s) + s; // 随机生成RGB中的B值 
        return new Color(r, g, b); 
    } 
 
 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
 
        this.doPost(request, response); 
    } 
 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException { 
 
        response.setHeader("Pragma", "No-cache"); 
        response.setHeader("Cache-Control", "No-cache"); 
        response.setDateHeader("Expires", 0); 
        //指定生成的响应图片 
        response.setContentType("image/jpeg"); 
        int width = 150;                            //指定生成验证码图片的宽度 
        int heigh = 60;                         //指定生成验证码图片的高度 
            //获得图像数据缓冲对象 
        BufferedImage bi = new BufferedImage(width,heigh,BufferedImage.TYPE_INT_RGB); 
            //获得图形上下文的抽象基类 
        Graphics g = bi.getGraphics(); 
        Random r = new Random(); 
        Font f = new Font("黑体",Font.PLAIN,60);  //定义字体样式 
        g.setColor(getRandColor(200, 250));     //设置背景颜色 
        g.fillRect(0, 0, width, heigh);         //绘制背景 
        g.setFont(f);                           //设置字体 
        g.setColor(getRandColor(180, 200));     //设置前景颜色 
         
         
        Graphics2D g2d = (Graphics2D) g; 
        //画一条折线      
        //BasicStroke bs=new BasicStroke(5f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //创建一个供画笔选择线条粗细的对象 
        //g2d.setStroke(bs);              //改变线条的粗细 
        g2d.setColor(Color.DARK_GRAY);      //设置当前颜色为预定义颜色中的深灰色 
        int[] xPoints=new int[8]; 
        int[] yPoints=new int[8]; 
        for(int j=0;j<8;j++){ 
            xPoints[j]=r.nextInt(width - 1); 
            yPoints[j]=r.nextInt(heigh - 1); 
        } 
        g2d.drawPolyline(xPoints, yPoints,8); 
         
        String sRand = ""; 
        String ctmp = ""; 
        int itmp = 0; 
        for (int i = 0; i < 6; i++) { 
            switch (r.nextInt(2)) { 
            case 1: 
                itmp = r.nextInt(26) + 65; // 生成A~Z的字母 
                ctmp = String.valueOf((char) itmp); 
                break; 
            default: 
                itmp = r.nextInt(10) + 48; // 生成0~9的数字 
                ctmp = String.valueOf((char) itmp); 
                break; 
            } 
            sRand += ctmp; 
            //设置每个字符的随机颜色 
            Color color = new Color(20 + r.nextInt(210), 20 + r.nextInt(210), 20 + r.nextInt(210)); 
            g2d.setColor(color); 
            //设置每个字符的随机字体 
            g2d.setFont(this.getRandomFont()); 
            //设置每个字符的随机旋转 
            AffineTransform at = new AffineTransform(); 
            int number = r.nextInt(3)-1; 
            double role = number*r.nextDouble()*(Math.PI/4); 
            at.setToRotation(role,25*i+5,55-r.nextInt(20)); //role:旋转角度,后面两个参数是设置围绕坐标点旋转 
            g2d.setTransform(at); 
             
            g2d.drawString(ctmp, 25*i+5,55-r.nextInt(20)); 
        } 
           HttpSession session = request.getSession(true); 
           session.setMaxInactiveInterval(5*60);//设置session对象5分钟失效 
           session.setAttribute("code", sRand.toString()); 
 
           g2d.dispose(); 
 
            System.out.println(sRand); 
            ImageIO.write(bi, "JPEG", response.getOutputStream()); 
           
             
    } 
     
    
     public static Font getRandomFont() {   
            //String[] fonts = {"Georgia", "Verdana", "Arial", "Tahoma", "Time News Roman", "Courier New", "Arial Black", "Quantzite"};   
            String[] fonts = {"a_TrianglerCmUp","Astarisborn","WishfulWaves"}; 
            Random r = new  Random(); 
           int fontIndex = r.nextInt(fonts.length); 
            return new Font(fonts[fontIndex],  r.nextInt(3),50-r.nextInt(20));   
        } 
}


<body>
     <div><img src="checkcode" alt="验证码" id="check_image"/></div>
     <a href="javascript:;" id="checkcode_a">看不清,换一张</a>
</body>


<!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>
<script type="text/javascript" src="js/jquery-1.11.0.js"></script>
<script type="text/javascript">
 $(document).ready(function(){
  var i = 1;
  $("#button").click(function(){
   i = i+1;
   var servletpath = "checkcode?a="+i;
   var img = "<img src='" + servletpath + "' width='120' height='60'/>";
   $("#image_div").html("");
   $("#image_div").html(img);
  });
 });
</script>
</head>
<body>
 <input type="button" id="button" value="showimage"/>
 <div id="image">
 sdfsdfsdfdsfsdf
 </div>
 <div id="image_div">
  <img alt="" src="" id="image_code">
 </div>
</body>

</html>


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值