手把手教你绘制网页验证码

验证码

本文的中的验证码使用Java的awt进行绘制,样式如下图所示

接下来开始进行绘制。

(1)创建一个Web项目,项目的目录结构如下

(2)创建Servlet类,继承HttpServlet,重写doGet和doPost方法

PicCodeServlet.java

package com.ghq.controller;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
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 PicCodeServlet extends HttpServlet{
    private static final long serialVersionUID = 1L;

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");

        String method = request.getParameter("whichrequest");
        if (method.equals("getCode")) {
            getCode(request, response);
        }else if (method.equals("checkCode")) {
            checkCode(request, response);
        }
    }

    //验证输入验证码是否正确
    private void checkCode(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //获取session中存储的验证码
        HttpSession session = request.getSession();
        String syscode = (String)session.getAttribute("checkcode");
        //获取输入的验证码
        String inputcode = request.getParameter("code");

        response.setContentType("text/html;charset=utf-8");
        PrintWriter writer = response.getWriter();
        //判断验证码是否相同
        if (!syscode.equalsIgnoreCase(inputcode)) {
            writer.print("验证码不正确");
        }
        writer.close();
    }

    //获取验证码的方法
    private void getCode(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Random ran = new Random();
        //定义验证码区域的长和宽
        int w = 100;
        int h = 30;
        //创建图片, bi指向了一个可以访问缓冲区的图片
        BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        //获得画笔
        Graphics g = bi.getGraphics();
        //创建颜色对象 参数范围是[0-255];
        Color c = new Color(200+ran.nextInt(50), 200+ran.nextInt(50), 200+ran.nextInt(50));
        //存放字体对象
        Font f = null;
        //设置画笔颜色
        g.setColor(c);
        //填充矩形
        g.fillRect(0, 0, w, h);
        //存放验证码的StringBuffer
        StringBuffer stringbuffer = new StringBuffer();
        //在图片上写验证码
        for (int i = 0; i < 4; i++) {
            c = new Color(100+ran.nextInt(50), 100+ran.nextInt(50), 100+ran.nextInt(50));
            f = new Font("隶书", Font.BOLD, 18);
            g.setFont(f);
            g.setColor(c);

            //产生大小写字母的Unicode码和数字随机数 a为97 ,A为65
            int lowUni = 97+ran.nextInt(26);
            int upUni = 65+ran.nextInt(26);
            int num = ran.nextInt(10);
            //将Unicode码转为字符串
            String lowUnistr = String.valueOf((char)lowUni);
            String upUnistr = String.valueOf((char)upUni);
            String nstr = String.valueOf(num);

            //随机产生大小写字母或数字中的一个
            String checkcode1 = ran.nextInt(2) < 0.5 ? (ran.nextInt(2) < 0.5 ? lowUnistr : upUnistr) : nstr;
            stringbuffer.append(checkcode1);

            //在图片上写验证码
            g.drawString(checkcode1, (i+1)*20, 20);
        }
        //将验证码保存在session中以便进行校验
        HttpSession session = request.getSession();
        session.setAttribute("checkcode", stringbuffer.toString());

        //绘制干扰线
        for (int i = 0; i < 30; i++) {
            c = new Color(150+ran.nextInt(50), 150+ran.nextInt(50), 150+ran.nextInt(50));
            g.setColor(c);
            //两点确定一条直线
            int x1 = ran.nextInt(90);
            int y1 = ran.nextInt(20);
            int x2 = ran.nextInt(20)+x1;
            int y2 = ran.nextInt(20)+y1;
            g.drawLine(x1, y1, x2, y2);
        }
        //将图片绘制到响应的输出流中
        ImageIO.write(bi, "jpg", response.getOutputStream());
    }

}

(3)在web.xml中配置Servlet

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <servlet>
    <servlet-name>PicCodeServlet</servlet-name>
    <servlet-class>com.ghq.controller.PicCodeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>PicCodeServlet</servlet-name>
    <url-pattern>/PicCodeServlet</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

(4)开发jsp页面

index.jsp

 <script type="text/javascript" src="<%=path %>/js/jquery-1.9.1.min.js"></script>
  <script type="text/javascript">
  function changeCode(){
      $("#img").attr("src","<%=path %>/PicCodeServlet?whichrequest=getCode&t="+Math.random());
  }
  function judgeCode(code){
      $.ajax({
          type:"post",
        url:"<%=path%>/PicCodeServlet",
        data:"whichrequest=checkCode&code="+code,
        success:function(resText){
            if (resText == "") {
                $("#spancode").html(resText);
            }else{
                $("#spancode").html(resText);
                changeCode();
            }
        },
        error:function(){
            window.location.href="<%=path%>/building.jsp";
        }
      });
  }

  function judgename(name){
      if (name.trim().length <= 0) {
           $("#spanname").html("用户名不能为空");
        }else{
             $("#spanname").html("");
        }
  }

  function judgepass(pass){
        if (pass.trim().length <= 0) {
           $("#spanpass").html("密码不能为空");
        }else{
           $("#spanpass").html("");
        }
      }

  </script>
  <body>
    <form action="" method="post">
      用户名:<input type="text" name="username" onblur="judgename(this.value)"><span id="spanname"></span><br>
      密码:<input type="password" name="userpass" onblur="judgepass(this.value)"><span id="spanpass"></span><br>
      验证码:<input type="text" name="checkcode" onblur="judgeCode(this.value)">
      <img src="<%=path %>/PicCodeServlet?whichrequest=getCode" onclick="changeCode()" id="img"><span id="spancode"></span>
    </form>
  </body>

效果展示

点击验证码的图片,实现验证码的更换。

原文地址:https://www.cnblogs.com/ghq120/p/8453971.html

时间: 2024-11-06 12:13:21

手把手教你绘制网页验证码的相关文章

android 手把手教你绘制圆形头像

自从腾讯QQ中的圆形头像,火了起来后,现在我们在一些应用中都能看到圆形头像的身影,在个人主页或者个人资料面板中使用圆形头像,会使整个布局变得更加优雅 现在我们来进行第一步,创建一个继承ImageView的抽象类MakeRoundImage.让他重写onDraw方法,并且声明一个画笔 import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import androi

Android消息推送:手把手教你集成小米推送

前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 该文档基于小米推送官方Demo,并给出简易推送Demo 看该文档前,请先阅读我写的另外两篇文章: 史上最全解析Android消息推送解决方案 Android推送:第三方消息推送平台详细解析 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo

手把手教你建github技术博客by hexo

适合人群 喜欢写Blog的人 有一定的编程基础 爱折腾的人 熟练使用版本控制Git 了解使用Github 熟悉基本的MarkDown语法 环境准备 安装Git 下载 msysgit 并执行即可完成安装. 安装Node.js 在 Windows 环境下安装 Node.js 非常简单,仅须下载安装文件并执行即可完成安装. 安装hexo 利用 npm 命令即可安装.(在任意位置点击鼠标右键,选择Git bash) npm install -g hexo 问题 * npm ERR! registry e

微信测试工程师手把手教你做弱网络模拟测试

微信测试工程师手把手教你做弱网络模拟测试 Posted by 腾讯优测 | 3,152 views 小优有话说: app研发不同于实验室里做研究,哪里有"理想环境". 理想里,用户用着性能卓越的手机,连着畅通无阻的wifi网络. "哇塞!这个app好用到飞起!" 现实是,他们可能正用着你闻所未闻的机型,穿梭于地铁.公交.火车.乡间.大山-.. 信号"若隐若现,扑朔迷离" "我去!又crash了!" "唉,怎么又连不上

手把手教你写专利申请书/怎样申请专利

手把手教你写专利申请书·怎样申请专利 摘要小前言(一)申请前的准备工作    1.申请前查询    2.其它方面的考虑    3.申请文件准备(二)填写专利申请系列文档    1.实际操作步骤    2.详细操作    3.经验分享.注意事项(三)关于费用(四)其它的话參考资源提示常见问题的问与答 摘要: 怎样写好专利申请?由于非常多专利申请人都是第一次申请,因此,可能有一种神奇和些许恐惧.本文写的是怎样写专利申请书,手把手教你写专利申请并提供申请专利时的注意事项,专利申请费用及费用减缓等相关參

CSS3实战开发:手把手教你鼠标滑动特效开发

各位网友,如果你已经看过我的CSS3实战开发系列教程,我相信你对CSS3已经有了非常全面深刻的了解.有些人可能CSS3语法掌握了不少,但是真正实际用起来还有点生疏,甚至无从下手.请别担心,我会不断更新一系列实战开发案例,我会为大家分步骤剖析特效开发过程. 今天我将手把手带领大家开发一个鼠标滑动的特效案例,废话不多说,直接上效果动画: 你有没有觉得上面的这个特效很棒呢! 好,现在咱们就开始分步骤实战开发这个动画特效吧: 首先,我们先准备好html页面代码: <!DOCTYPE html> <

手把手教你uiautomator_android自动化测试第一个示范

手把手教你uiautomator_android自动化测试第一个示例 android的自动化测试方案,弄了好久了. Google在sdk4.0以后提供了一个自动化解决方案uiautomator: 优点:可以跨应用了:这可是亲生的: 缺点:必须sdk4.0以上版本:要想实现的好,最好有开发配合:java项目编译为jar后需要push到手机才能运行,也就是说必须打印日志暴力调试. 后来听到群友Teddy说到appium和calabash-android,翻了一下appium的文章,发现: 01.jp

CSS3实战开发:手把手教大家搜索表单发光特效实战开发

各位网友,大家好,我是陌上花会开,今天这个案例,我将带领大家,手把手教大家开发一个会发光的表单组,还是先秀运行效果图吧: 从这个效果图,大家可以发现,当光标在某个组件上时,它就会发光,今天我将带领大家实战开发这个特效. PS: 大家可以直接将博客中的代码复制到本地便可得到同样的运行效果. 首先,我们先准备好html代码: <!doctype html> <html> <head> <meta charset="utf-8"><met

手把手教你nginx基础安装配置

手把手教你nginx基础安装配置! 一.Nginx安装及简单配置: 安装环境和依赖的包: #yum groupinstall "developmenttools" "server platform development" # yum -yinstall pcre-devel #yum install openssl-devel 下载相关nginx源码包: #wgethttp://nginx.org/download/nginx-1.6.2.tar.gz 解压缩源码