ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

后端java的验证码的实现

2022-01-25 09:32:53  阅读:196  来源: 互联网

标签:java 后端 int random 验证码 height nextInt graphics width



/* 获取验证码图片*/
 
         @RequestMapping("/getVerifyCode ")
 
         public void getVerificationCode(HttpServletResponse response,HttpServletRequest request) {
 
                   try {
 
                            int width=200;
 
                            int height=69;
 
         BufferedImage verifyImg=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
 
//生成对应宽高的初始图片
 
                            String randomText = VerifyCode.drawRandomText(width,height,verifyImg);
 
//单独的一个类方法,出于代码复用考虑,进行了封装。
 
//功能是生成验证码字符并加上噪点,干扰线,返回值为验证码字符                   
 
request.getSession().setAttribute("verifyCode", randomText);
 
                   response.setContentType("image/png");//必须设置响应内容类型为图片,否则前台不识别
 
                 OutputStream os = response.getOutputStream(); //获取文件输出流    
 
                 ImageIO.write(verifyImg,"png",os);//输出图片流
 
                 os.flush();
 
                 os.close();//关闭流
 
                   } catch (IOException e) {
 
                            this.logger.error(e.getMessage());
 
                            e.printStackTrace();
 
                   }
 
         }


/*对图片进行处理的类和方法*/
 
public class VerifyCode {  
 
    public static  String drawRandomText(int width,int height,BufferedImage verifyImg) {
 
             Graphics2D graphics = (Graphics2D)verifyImg.getGraphics();
 
             graphics.setColor(Color.WHITE);//设置画笔颜色-验证码背景色
 
             graphics.fillRect(0, 0, width, height);//填充背景
 
        graphics.setFont(new Font("微软雅黑", Font.BOLD, 40));
 
        //数字和字母的组合
 
String baseNumLetter= = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
 
        StringBuffer sBuffer = new StringBuffer();
 
        int x = 10;  //旋转原点的 x 坐标
 
        String ch = "";
 
        Random random = new Random();
 
        for(int i = 0;i < 4;i++){
 
                 graphics.setColor(getRandomColor());
 
            //设置字体旋转角度
 
            int degree = random.nextInt() % 30;  //角度小于30度
 
            int dot = random.nextInt(baseNumLetter.length());
 
            ch = baseNumLetter.charAt(dot) + "";
 
            sBuffer.append(ch);
 
            //正向旋转
 
            graphics.rotate(degree * Math.PI / 180, x, 45);
 
            graphics.drawString(ch, x, 45);
 
            //反向旋转
 
            graphics.rotate(-degree * Math.PI / 180, x, 45);
 
            x += 48;
 
        }
 
        //画干扰线
 
        for (int i = 0; i <6; i++) {
 
            // 设置随机颜色
 
                 graphics.setColor(getRandomColor());
 
            // 随机画线
 
                 graphics.drawLine(random.nextInt(width), random.nextInt(height),
 
                                    random.nextInt(width), random.nextInt(height));
 
        }
 
        //添加噪点
 
        for(int i=0;i<30;i++){
 
                 int x1 = random.nextInt(width);
 
                 int y1 = random.nextInt(height);
 
                 graphics.setColor(getRandomColor());
 
                 graphics.fillRect(x1, y1, 2,2);
 
                 }
 
        return sBuffer.toString();
 
    }
 
    /**
     * 随机取色
     */
 
    private static Color getRandomColor() {
 
        Random ran = new Random();
        Color color = new Color(ran.nextInt(256),
                ran.nextInt(256), ran.nextInt(256));
 
        return color;
 
    }
 
}
 

标签:java,后端,int,random,验证码,height,nextInt,graphics,width
来源: https://blog.csdn.net/weixin_58276266/article/details/122678954

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有