zoukankan      html  css  js  c++  java
  • Java验证码和ajax判断

    关于来了解相关的api

    BufferedImage(int width, int height, int imageType) 构造一个类型为预定义图像类型之一的 BufferedImage

    BufferedImage 描述具有可访问图像数据缓冲区的Image 字段摘要(TYPE_INT_RGB)表示一个图像,它具有合成整数像素的 8 位 RGB 颜色分量。

    getGraphics() 此方法返回 Graphics2D(Graphics2D 类扩展 Graphics 类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。它是用于在 Java(tm) 平台上呈现二维形状、文本和图像的基础类。)

    jquery 相关api : post请求异步更新

    实现效果如图

    首相是先关的html代码:

    <html>
    
    <head>
        <meta charset="utf-8">
        <title>欢迎注册</title>
        <script type="text/javascript" src="js/jquery-1.10.1.js"></script>
        <style>
        #main {
            580px;
            height: 400px;
            margin: auto;
            margin-top: 200px;
        }
        
        #main input {
            margin-top: 10px;
        }
        
        .btn {
             80px;
            height: 30px;
            background: green;
            color: white;
            font-size: 18px;
        }
        form{
            400pxs;
        }
        #name{
            display: none;
        }
        #uId{
            display: none;
        }
        </style>
    </head>
    <script type="text/javascript"> 
    
                 $(function(){
                    $("#userName").change(function(){
                       var mreg = /^[u4E00-u9FA5]{2,4}$/; 
                                if(!mreg.test($("#userName").val())) 
                                {
                                    $("#name").css('display','inline');
                                    $("#btns").attr('disabled',true);
                                    $("#btns").css('background','grey');
                                   
                                } else{
                                    $("#name").css('display','none');
                                    $("#btns").attr('disabled',false);
                                    $("#btns").css('background','green');
                                }
    
                        var val=$("#userName").val();
                        val=$.trim(val);  //去除空格
                        if (val != null) {
                          var url="/ShoppingCar/valiateUserName";
                          var args={"userName":val,"time":new Date()};
                          	$.post(url, args, function(data) {
                            $("#exist").html(data);
                          });
                        }
                    })
    
                    $("#code").change(function() {
                        var value=$("#code").val();
                        value=$.trim(value);
                        if (value != null) {
                            var url="/ShoppingCar/CodeCheck";
                            //加上时间,防止缓存,这里就相当于发送一个post请求,和表单请求的格式相近,一个变量名,一个值,成对发送
                            var args={"code":value,"time":new Date()};
                            //发送请求,返回的内容封装在data中
                            $.post(url, args, function(data) {
                            $("#checkcode").html(data);
                        });
                      }
                    })
                 });
    
                 function changeCode() {
                    var imgNode = document.getElementById("vimg");
                    //重新加载验证码,达到刷新的目的  
                    imgNode.src = "/ShoppingCar/AuthImageServlet?t=" + Math.random();  // 防止浏览器缓存的问题 
                }
         </script>
    <body>
    
      
    
        <div id="main">
            <h2  style="margin-left: 40px;">请填写以下信息</h2>
            <form action="/ShoppingCar/RegisterServlet" method="post">
                                    账 号:
                <input type="text" name="userName" id="userName" /><span id="name" style="color: red"> 名字只能是中文</span>
                 <span id="exist"></span>
                <br/> 密 码:
                <input type="password" name="password" />
                <br />
                                  验证码:
                <input type="text" name="code" id="code"> <span id="checkcode" ></span><br>
                <img id="vimg"  title="点击更换" onclick="changeCode();" src="/ShoppingCar/AuthImageServlet" style="margin-left: 99px;margin-top: 10px;"><br/>
                <p style="margin-top:10px;margin-left:42px;">
                        <input type="submit"  value="注册" style="margin:auto;" class="btn" id="btns" />
                        <a href="/ShoppingCar/login.html"><input type="button"  value="登入" style="margin:auto;" class="btn" /></a>
                </p>
            </form>
        </div>
      
         
    </body>
    
    </html>
    

      接下来是服务器端生成验证码的servlet

    package gqx.shoppingcar.testservlet;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    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;
    
    public class AuthImageServlet extends HttpServlet {
    
    	private static final String CONTENT_TYPE = "text/html; charset=gb2312";     
        //设置字母的大小,大小     
        private Font mFont = new Font("Times New Roman", Font.PLAIN, 24);     
        public void init() throws ServletException     
        {     
            super.init();     
        }     
        //指定范围内生成rgb颜色
        Color getRandColor(int fc,int bc)     
        {     
            Random random = new Random();     
            if(fc>255) fc=255;     
            if(bc>255) bc=255;     
            int r=fc+random.nextInt(bc-fc);     
            int g=fc+random.nextInt(bc-fc);     
            int b=fc+random.nextInt(bc-fc);     
            return new Color(r,g,b);     
        }     
        
        public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException     
        {     
        	//no-cache指示请求或响应消息不能缓存
            response.setHeader("Pragma","No-cache");     
            response.setHeader("Cache-Control","no-cache");     
            response.setDateHeader("Expires", 0);     
            //表明生成的响应是图片     
            response.setContentType("image/jpeg");     
                 
            int width=100, height=25;     
          //创建一个图片缓冲区
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);     
          //获取图片处理对象     
            Graphics g = image.getGraphics();     
          //填充背景色
            Random random = new Random();     
            g.setColor(getRandColor(200,250));     
            g.fillRect(1, 1, width-1, height-1);   
            //设定边框颜色
            g.setColor(new Color(102,102,102));     
            g.drawRect(0, 0, width-1, height-1); 
            
          //画随机线     
            for (int i=0;i<15;i++)     
            {     
                int x = random.nextInt(width - 1);     
                int y = random.nextInt(height - 1);     
                int xl = random.nextInt(6) + 1;     
                int yl = random.nextInt(12) + 1;     
                g.drawLine(x,y,x + xl,y + yl);     
            }     
        
            //从另一方向画随机线     
            for (int i = 0;i < 10;i++)     
            {     
                int x = random.nextInt(width - 1);     
                int y = random.nextInt(height - 1);     
                int xl = random.nextInt(12) + 1;     
                int yl = random.nextInt(6) + 1;     
                g.drawLine(x,y,x - xl,y - yl);     
            }    
            
            
          //写入文字
            g.setFont(mFont);     
            //生成随机数,并将随机数字转换为字母     
            String sRand="";     
            for (int i=0;i<4;i++)     
            {     
                int itmp = random.nextInt(26) + 65;     
                char ctmp = (char)itmp;     
                sRand += String.valueOf(ctmp);    
                g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); 
                //使用此图形上下文的当前字体和颜色绘制由指定 string 给定的文本。
                //void drawString(String str, int x,int y)		str - 要绘制的 string。 x - x 坐标。   y - y 坐标
                g.drawString(String.valueOf(ctmp),22*i+10,22);     
            }     
        
            HttpSession session = request.getSession(true);     
            session.setAttribute("rand",sRand);     
            g.dispose(); 
            //使用支持给定格式的任意 ImageWriter 将一个图像写入 OutputStream。
            ImageIO.write(image, "JPEG", response.getOutputStream());     
        }     
    }
    

    在一个是响应页面发送来的数据,同时做出判断,将结果返回给显示层

    package gqx.shoppingcar.testservlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class CodeCheck extends HttpServlet {
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		String code=request.getParameter("code");
    		String result="";
    		HttpSession session=request.getSession();
    		System.out.println(code);
    		String value=(String)session.getAttribute("rand");
    		if (!code.equals(value)) {
    			result="<font color='red'>验证码错误</font>";
    			System.out.println("error");
    		}else {
    			
    		}
    		 response.setContentType("text/html;charset=UTF-8");
    		 System.out.println(result);
    		 response.getWriter().print(result);
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		this.doGet(request, response);
    	}
    
    }
    

    至于名字的检验大同小异

    package gqx.shoppingcar.testservlet;
    
    import gqx.shoppingcar.service.impl.SerOperate;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class valiateUserName extends HttpServlet {
    
    	/**
    	 * 处理ajax验证名字是否已经存在
    	 */
    	private static final long serialVersionUID = 1L;
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		String name=request.getParameter("userName");
    		SerOperate operate =new SerOperate();
    		String result=null;
    		if (operate.exist(name)) {
    			result="<font color='red'>该用户名已经被使用</font>";
    			
    		}else {
    			result=" ";
    		}
    		response.setContentType("text/html;charset=UTF-8");		
    		 response.getWriter().print(result);
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		this.doGet(request, response);
    	}
    
    }
    

    此处的SerOperate是我在MVC的Service层处理的接口实现类。具体就不写了,会在后面的购物车代码中全部写上去。

  • 相关阅读:
    vue--父组件向子组件传参--父组件定义v-bind:参数名--子组件接收props----子组件调用父组件的方法(子组件向父组件传参)父组件@事件名称--子组件接收this.$emit
    vue--组件切换--带动画效果---component
    js string类型转换成数组对象类型---eval
    Vue--创建组件-template---定义私有组件
    vue--自定义标签属性--用于多个事件共同引用一个组件--但是两个事件要实现的功能不同-避免冲突
    vue--组件动画效果--淡入淡出--位移
    vue---向后台添加数据--删除数据--事件方法传参---在单页面配置url请求地址--暂时没有用到webpack
    vscode安装Bootstrap插件--方便补全代码段
    vue-resource--ajax请求数据
    生命周期演示--从加载--渲染--销毁
  • 原文地址:https://www.cnblogs.com/helloworldcode/p/6079200.html
Copyright © 2011-2022 走看看