javaweb验证码的生成与使用

  • 随机数与验证码图片的生成
    package com.zg.sxsh.serviceImpl;
    
    import com.zg.sxsh.service.IVerificationCodeImage;
    
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.util.Random;
    
    public class VerificationCodeImage implements IVerificationCodeImage {
        //ASCII  0-9 48-57 A-Z 65-90 a-z 97-122
        static int[] asciis=codeASCII();
        /**
         * 把数字与字母的ASCII码存入int[]中
         * @return int[]
         */
        static int[] codeASCII(){
            int[] asciis=new int[62];
            int ascii=48;
            for (int i=0;i<10;i++){
                asciis[i]=ascii;
                ascii++;
            }
            ascii=65;
            for (int i=10;i<36;i++){
                asciis[i]=ascii;
                ascii++;
            }
            ascii=97;
            for (int i=36;i<62;i++){
                asciis[i]=ascii;
                ascii++;
            }
            return asciis;
        }
    
        /**
         * 生成一串字符串
         * @param codeLength 字符串长度
         * @param isNum 字符串是否有数字
         * @param isABC 字符串是否有字母
         * @return
         */
        @Override
        public String randomVerificationCode(int codeLength, boolean isNum, boolean isABC) {
            String verificationCode="";
            int index=0;
            for(int i=0;i<codeLength;i++){
                if (isNum&isABC){
                    index=randomNum(0,62);
                }
                else if(isNum){
                    index=randomNum(0,10);
                }
                else if (isABC){
                    index=randomNum(10,62);
                }
                verificationCode+=String.valueOf((char) asciis[index]);
            }
            return verificationCode;
        }
    
        /**
         * 返回一个[minNum,maxNum)的随机数
         * @param minNum 最小数
         * @param maxNum 最大数
         * @return 返回一个字符串
         */
        private int randomNum(int minNum,int maxNum){
            Random random=new Random();
            return random.nextInt(maxNum)+minNum;
        }
    
        private static final int IMAGE_WIDTH=100;
        private static final int IMAGE_HEIGHT=42;
    
        /**
         * 生成验证码图片缓存
         * @param verificationCode 验证码字符串
         * @return 图像缓存
         */
        @Override
        public BufferedImage createVerificationCodeImage(String verificationCode){
            //定义图像buffer
            BufferedImage bufferedImage=new BufferedImage(IMAGE_WIDTH,IMAGE_HEIGHT,BufferedImage.TYPE_INT_RGB);
            Graphics graphics=bufferedImage.getGraphics();
            Color color=Color.white;
            //设置画笔颜色
            graphics.setColor(color);
            //设置图像形状和大小
            graphics.fillRect(0,0,IMAGE_WIDTH,IMAGE_HEIGHT);
    
            //设置字体
            Font font =new Font("微软雅黑",Font.BOLD,30);
            graphics.setFont(font);
            //设置画笔颜色
            graphics.setColor(Color.black);
            //绘制文字
            graphics.drawString(verificationCode,10,31);
            //Graphics转换成Graphics2D
            Graphics2D graphics2D=(Graphics2D)graphics;
            //设置画笔粗细
            graphics2D.setStroke(new BasicStroke(2));
            //设置八个点
            Point[] points=new Point[8];
            for (int i=0;i<4;i++){
                points[i]=new Point();
                points[i].x=1;
                points[i].y=randomNum(1,IMAGE_HEIGHT);
            }
            for (int i=4;i<8;i++){
                points[i]=new Point();
                points[i].x=IMAGE_WIDTH-1;
                points[i].y=randomNum(1,IMAGE_HEIGHT);
            }
            System.out.println(points);
            //根据生成的八个点,画4条干扰线
            for (int i=0;i<4;i++){
                graphics2D.drawLine(points[i].x,points[i].y,points[i+4].x,points[i+4].y);
            }
            return bufferedImage;
        }
    }
    

     

  •  把图片缓存转成Stream
    package com.zg.sxsh.action;
    
    import com.opensymphony.xwork2.ActionSupport;
    import com.zg.sxsh.serviceImpl.VerificationCodeImage;
    import org.apache.struts2.ServletActionContext;
    
    import javax.imageio.ImageIO;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import java.awt.image.BufferedImage;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    
    public class VerificationCodeAction extends ActionSupport {
    
        private ByteArrayInputStream inputStream;
    
        public ByteArrayInputStream getInputStream() {
            return inputStream;
        }
    
        /**
         * 把图片缓存转成Stream
         * @return
         * @throws Exception
         */
        @Override
        public String execute() throws Exception {
            //实例化验证码图片生成类
            VerificationCodeImage codeImage=new VerificationCodeImage();
            //生成验证码
            String code=codeImage.randomVerificationCode(4,true,true);
            //获取request
            HttpServletRequest request= ServletActionContext.getRequest();
            //获取Session
            HttpSession session=request.getSession();
            //把验证码存入session
            session.setAttribute("code",code);
            //获取图片缓存
            BufferedImage image= codeImage.createVerificationCodeImage(code);
            // 创建输出流
            ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
            //把图片缓存写入输出流
            ImageIO.write(image,"jpg",outputStream);
            //把图片输出流赋值给输入流
            inputStream=new ByteArrayInputStream(outputStream.toByteArray());
            //关闭输出/输入流
            outputStream.close();
            inputStream.close();
    
            return SUCCESS;
        }
    }
    

     

  • action中引用
            <action name="verification_code" method="execute" class="com.zg.sxsh.action.VerificationCodeAction">
                <result name="success" type="stream">
                    <param name="contentType">image/jpg</param>
                    <param name="inputName">inputStream</param>
                </result>
            </action>
     
  • jsp页面中调用
    <img src="/verification_code" onClick="this.src='verification_code?timestamp='+Date.now()" alt="验证码">
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值