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 {
        width:580px;
        height: 400px;
        margin: auto;
        margin-top: 200px;
    }

    #main input {
        margin-top: 10px;
    }

    .btn {
        width: 80px;
        height: 30px;
        background: green;
        color: white;
        font-size: 18px;
    }
    form{
        width: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层处理的接口实现类。具体就不写了,会在后面的购物车代码中全部写上去。

时间: 2024-10-24 09:32:46

Java验证码和ajax判断的相关文章

java端拦截器判断客户的的请求是否是ajax请求

1 java端拦截器判断客户的的请求是否是ajax请求 2 3 4 发表于 2014-08-22 23:38:08 5 普通请求与ajax请求的报文头不一样,通过如下 6 7 String requestType = request.getHeader("X-Requested-With"); 8 9 如果requestType能拿到值,并且值为XMLHttpRequest,表示客户端的请求为异步请求,那自然是ajax请求了,反之如果为null,则是普通的请求 10 11 http:/

springMVC+Java验证码完善注册功能

这篇文章简单的写了一个java验证码,为之前写过的springMVC注册功能加上验证码,验证码的作用就不多说了,防止机器人程序恶意注册什么的... 基本的注册功能的实现请查看之前的文章Maven搭建springMVC+spring+hibernate实现用户注册 其中,我修改了该注册程序的部分代码,其中User.java,加上了password和code的属性,同时将password持久到数据库,code属性使用@transient注解使其不被持久到数据库. User.java 中加上这两个属性

Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求

Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 java 判断请求是不是ajax请求,Java判断是否为ajax请求 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ?Copyright 蕃薯耀 2017年8月10日 http://www.cnblogs.com/

JAVA学习日志——Ajax和Json

# JAVA学习日志--Ajax和Json # Ajax和Json在一个web项目中可以说是经常用到了,Ajax是一种用于创建快速动态网页的技术,而Json则是一种与语言无关的数据交换的格式.以下是个人在学习过程中的总结. 一.Ajax 1.同步与异步 在学习Ajax之前我们要先知道什么是同步,什么是异步. 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待卡死状态. 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随    意做其他事情,不会被卡

第88节:Java中的Ajax和ASP.NET和TCP/IP 教程和JSON

第88节:Java中的Ajax和Jquery ajax是什么?有什么用?原理,怎么用? ajax是asynchronous javascript and xml(异步javascript和xml),是指一种创建交互式网页应用的网页开发技术. 如用户注册,输入的用户名,提示已经被注册了. AJAX Asynchronous JavaScript and XML ajax是一种不用重新加载整个网页的情况下,能够更新部分网页的技术. 什么是ajax? 是 异步 JavaScript 和 XML,是一种

Java中的空值判断

Java中的空值判断 /** * 答案选项: * A YouHaidong * B 空 * C 编译错误 * D 以上都不对 */ package com.you.model; /** * @author YouHaidong * */ public class NullString { /** * @param args */ public static void main(String[] args) { String i = ""; if(i == i + 1) { System

Java编程:正则表达式判断邮箱及电话号码是否有效

/** * 正则判断邮箱及电话号码是否有效 * @param args */ public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入你的邮箱:");  String email = sc.next();   System.out.println("请输入你的电话号码:");      String phone = sc.

点滴积累【C#】---验证码,ajax提交

效果: 思路: 借用ashx文件创建四位验证,首先生成四位随机数字.然后创建画布,再将创建好的验证码存入session,然后前台进行button按钮将文本框中的值进行ajax请求到后台,和session中的验证码进行对比,成功返回true,失败返回false. 代码: [前台] 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="verifycodeDemo.aspx.cs"

(转)java验证码识别

java验证码识别--1 http://blog.csdn.net/problc/article/details/5794460 java验证码识别--2 http://blog.csdn.net/problc/article/details/5797507 java验证码识别--3 http://blog.csdn.net/problc/article/details/5800093 java验证码识别--4 http://blog.csdn.net/problc/article/detail