Java Web 回顾总结(五) - HttpServlet - Response - 5.3.3 验证码生成

本人不专攻图片方向 ,基本验证码都来自网络,摘抄如下

验证码图片生成Servlet类,直接调用该Servlet即可使用
取值的时候调用session.getAttribute("code")得到生成的值

package com.servlet.rep;

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


import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;



@WebServlet("/SafeCodeImageServlet")
public class SafeCodeImageServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    // 设置所有可能出现的字符
    static final char[] safeCode = {
        '2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','m','n','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z'
        /*'1','l','0','O','o','#','@','$','%','&','(',')','|','/','*','^','!','~','\\'*/  
    };

    //设置随机数
    static Random random = new Random();

    //使用随机数获取随机字符
    static  String getRandomCode(int n) {
        String string = "" ;

        for(int i =0 ; i < n ;i++) {
            string = string + safeCode[random.nextInt(safeCode.length)]; 
        }

        return string;
    }

    //产生的随机颜色
    static Color getRandomColor() {
        return new Color(random.nextInt(255), random.nextInt(255), 
                random.nextInt(255), random.nextInt(255));
    }



    public SafeCodeImageServlet() {
        super();
        // TODO Auto-generated constructor stub
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("image/jpeg");

        String randomCode = this.getRandomCode(6);
        Color color = this.getRandomColor();

        request.getSession(true).setAttribute("code", randomCode);
        int width = 100 ;//验证码图片宽度
        int height = 30 ;//验证码图片高度



        //创建一个彩图(板)
        BufferedImage bImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        //创建绘图对象(笔)
        Graphics2D graphics2d = bImage.createGraphics();

        // 设置字体类型,粗体,字号
        graphics2d.setFont(new Font(Font.SANS_SERIF,Font.BOLD ,16));

        // 设置白色背景颜色
        graphics2d.setColor(new Color(255,255,255,255));

        // 设置边界
        graphics2d.fillRect(0, 0, width, height);

        // 设置字体颜色
        graphics2d.setColor(color);
        // 将字符画出
        graphics2d.drawString(randomCode, 18, 20);


        // 设置100 个矩形噪点
        for(int i =0 , n = random.nextInt(100) ;i <n;i++) {
            graphics2d.drawRect(random.nextInt(width), random.nextInt(height), 1, 1);
        }
        // 将图片输出
        ServletOutputStream outputStream  = response.getOutputStream();
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);
        encoder.encode(bImage);

        outputStream.flush();
        outputStream.close();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值