JavaWeb登录界面验证码的生成

JavaWeb 登录界面验证码的生成过程

第一步 : 生成随机字符串(准备作画)

   Random r =new  Random ();
           
           //获取随机字符串
           private String  getRandomStr(){
        	   String str="23456789ABCDEFGHIGKMNPQSTUVWXYZabcdefghgklmnpqstuvwxyz";
        	   //StringBuilder叫字符串缓存区对象,使用时可以不断添加字符、字符串等已有内容。
        	   //需要使用时调用toString()获得对象里的所有字符串。
        	   StringBuilder sb = new StringBuilder();
        	   
        	   for(int i=0 ;i<4;i++)
        	   {
        		   int index =r.nextInt(str.length());
        		   char letter =str.charAt(index);
        		   sb.append(letter);
        	   }
        	   return sb.toString();
        	   
           }

第二步: 生成随机的背景和前景色(准备画的色调)

      //获取随机的背景颜色   
      public Color getBackColor(){
    	  int red =r.nextInt(256);
    	  int green =r.nextInt(256);
    	  int blue =r.nextInt(256);    	      	
    	  return  new Color(red,green,blue);
    	  
    	  
      }
      //前景颜色和背景颜色要反差大所以我们的颜色需要相减
  public Color getForeColor(Color bgColor){
	
	  int  red =255-bgColor.getRed();
	  int  green  = 255-bgColor.getGreen();
	  int blue =255-bgColor.getBlue();
	  
	    
	  return new Color(red,green,blue);
	  
  }
           

第三步 构建图片内存 →拿到内存图片的画布→设置背景颜色(准备画纸和开始作画)

→设置填充长方形→设置前景色和字体→画上随机字符串→设置噪点颜色画上噪点

1.设置响应格式为图片.jpg
2.创建一个不带透明色的对象 图片对象 三原色
3.获取画布对象
4.设置背景颜色
5.画背景
6.设置前景色
7.设置字体
8.将随机字符串存到session
9.画
10.画噪点 干扰
11.将图片输出到响应流
12.把图片写到输出流区
注意!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
因为验证码需要我们打开网页时就显示 所以说它的跟随服务器的启动而生成 不能 调用请求的时候在执行 所以需要在配置文件中加上
在这里插入图片描述

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	//设置响应格式为图片.jpg
    resp.setContentType("image/jpeg");
    //创建一个不带透明色的对象 图片对象 三原色
    BufferedImage bufferedImage= new BufferedImage(80, 30, BufferedImage.TYPE_INT_RGB);
       //获取画布对象

    Graphics g = bufferedImage.getGraphics();
	//设置背景颜色
    Color bgColor =getBackColor();
    g.setColor(bgColor);
		//画背景
    g.fillRect(0, 0, 80,30);
    //设置前景色
    Color foreColor =getForeColor(bgColor);
    g.setColor(foreColor);
    
    //设置字体
    g.setFont(new Font("黑体",Font.BOLD,26));
    //将随机字符串存到session
        String randomStr =getRandomStr();
     HttpSession session = req.getSession();
       session.setAttribute("code", randomStr);
       //画
       g.drawString(randomStr, 10, 28);
       //画噪点 干扰
       for(int i =0;i<30;i++)
       {
    	   g.setColor(Color.white);
    	   int x = r.nextInt(80);
    	   int y= r.nextInt(30);
    	   g.fillRect(x, y, 1, 1);
       }
    
       //将图片输出到响应流
       ServletOutputStream sos = resp.getOutputStream();
       //把图片写到输出流区
       ImageIO.write(bufferedImage, "jpeg", sos);
       
       
       
       
       
       
       
       
       
	}
	

在UserServlet判断验证码是否正确

    System.out.println(session.getAttribute("code"));
                //2.2 提取session中的验证码,进行判断
               String code =session.getAttribute("code").toString();
               //不区分大小写
                if(!code.equalsIgnoreCase(userCode)){
                    out.println("<script>alert('验证码输入错误');location.href = 'login.html';</script>");
                    return;
                }

点击图片切换验证码

<script type="text/javascript">
        function Change() {
            var img = document.getElementById("img")
            //设置时间戳
            var date = new Date().getTime();
            img.src="codeServlet?"+date;
        }

        </script>
<img src="codeServlet" id="img" onclick="Change();"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值