我们登陆网站时,每次都会填写一些验证码,这些验证码的作用:防止被恶意攻击,验证码上面的字母数字一般都是随机生成的,因此我们首先要写一个方法生成一个随机的字符串,这里就需要java里面的随机函数Random,一般情况下我们将需要的字母数字放到一个静态的字符串中,让在随机生成一个数字下标,然后得到一个字符,验证码需要几个字符我们就生成几个字符。

(2)市面上的验证码一般都是以图片展示出来,因此我们需要一个图片的数据流,生成一个矩形的.jpg格式的图片。具体的代码展示:

  1.  
    package com.imooc.code;
  2.  
     
  3.  
    import java.awt.Color;
  4.  
    import java.awt.Font;
  5.  
    import java.awt.Graphics2D;
  6.  
    import java.awt.font.FontRenderContext;
  7.  
    import java.awt.geom.Rectangle2D;
  8.  
    import java.awt.image.BufferedImage;
  9.  
    import java.util.Random;
  10.  
     
  11.  
    import javax.imageio.ImageIO;
  12.  
    import javax.servlet.http.HttpServletResponse;
  13.  
     
  14.  
     
  15.  
    public class CapchCode {
  16.  
    public static String stringcode ="ABCDEFGHIJKLMNOPQISTUVWXYZ1234567890";
  17.  
    public static Random random = new Random();
  18.  
     
  19.  
     
  20.  
    public static String drawImage(HttpServletResponse response){
  21.  
    //1,得到随机生成的字符串
  22.  
    String code = drawString().toString();
  23.  
    //定义图片的宽度和高度
  24.  
    int height =25;
  25.  
    int width = 70;
  26.  
    //2。创建一个图片流
  27.  
    BufferedImage CodeImage = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
  28.  
     
  29.  
    //3:获取到 Graphics2D 绘制对象,开始绘制验证码
  30.  
    Graphics2D graphics2D = CodeImage.createGraphics();
  31.  
    //设置字体和颜色
  32.  
    Font font = new Font("微软雅黑", Font.PLAIN, 20);
  33.  
    Color color = new Color(0,0,0);
  34.  
    graphics2D.setColor(color);
  35.  
    graphics2D.setFont(font);
  36.  
    //设置背景
  37.  
    graphics2D.setBackground(new Color(226,226,240));
  38.  
     
  39.  
    //开始绘制对象的位置与长宽
  40.  
    graphics2D.clearRect(0,0,width,height);
  41.  
    //绘制形状,获取矩形对象
  42.  
    //绘制形状,获取矩形对象
  43.  
    FontRenderContext context = graphics2D.getFontRenderContext();
  44.  
    Rectangle2D bounds = font.getStringBounds(code,context);
  45.  
     
  46.  
    double x = (width - bounds.getWidth())/2;
  47.  
    double y = (height - bounds.getHeight())/2;
  48.  
     
  49.  
    double ascent = bounds.getY();
  50.  
    double baseY = y - ascent;
  51.  
    graphics2D.drawString(code,(int)x,(int)baseY);
  52.  
    //结束绘制
  53.  
    graphics2D.dispose();
  54.  
    try {
  55.  
    ImageIO.write(CodeImage,"jpg",response.getOutputStream());
  56.  
    //刷新响应流
  57.  
    response.flushBuffer();
  58.  
    }catch(Exception ex){
  59.  
    ex.printStackTrace();
  60.  
    }
  61.  
    return code;
  62.  
    }
  63.  
     
  64.  
    //产生一个Stringbuffer的字符串
  65.  
    public static StringBuffer drawString(){
  66.  
    StringBuffer buffer = new StringBuffer();
  67.  
    for(int i=0;i<4;i++)
  68.  
    buffer.append(stringchar());
  69.  
    return buffer;
  70.  
    }
  71.  
    //随机产生一个字母
  72.  
    public static char stringchar(){
  73.  
    return stringcode.charAt(random.nextInt(stringcode.length()));
  74.  
    }
  75.  
    }

(3)我们有时候登陆的时候,会遇到验证码看不清,或者不确定的情况下,需要重新生成一个有效的验证码。但是现在一般的浏览器都有记忆存储的功能,我们第一次生成一个验证码,如果不进行清除,那么就会一直展示第一个验证码,因此需要一个jsp来清理缓存。

  1.  
    <%@ page language="java" contentType="text/html; charset=UTF-8"
  2.  
    pageEncoding="UTF-8"%>
  3.  
    <%@page import="com.imooc.code.CapchCode" %>
  4.  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5.  
    <%
  6.  
     
  7.  
    //1:清空浏览器缓存,目的是为了清空浏览器的缓存,因为浏览器
  8.  
    //会对网站的资源文件和图像进行记忆存储,如果被浏览器加载过的图片就记忆起来,记忆以后
  9.  
    //文件就不会和服务器在交互,如果我们验证不清空的话可能会造成一个问题就是:验证刷新以后没有效果。
  10.  
    response.setHeader("pragma","no-cache");
  11.  
    response.setHeader("cache-control","no-cache");
  12.  
    response.setHeader("expires","0");
  13.  
     
  14.  
    //2:调用编写的生成验证码的工具
  15.  
    String code = CapchCode.drawImage(response);
  16.  
    session.setAttribute("code",code);
  17.  
     
  18.  
    //3:如何解决getOutputStream异常问题
  19.  
    out.clear();
  20.  
    out = pageContext.pushBody();
  21.  
    %>

(4) 最后将生成的验证码展示出来:

  1.  
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2.  
    <!DOCTYPE HTML>
  3.  
    <html>
  4.  
    <head>
  5.  
    <title>java验证码</title>
  6.  
    <meta http-equiv=www.longboshyl.cn "pragma" content="no-cache">
  7.  
    <meta http-equiv=www.thd540.com "cache-control" content="no-cache">
  8.  
    <meta http-equiv=www.dfgjpt.com/ "expires" content="0">
  9.  
    </head>
  10.  
    <body>
  11.  
     
  12.  
    <img src="code.jsp" alt=www.zhongdayule.cn/ "" id="code">
  13.  
    <a href="javascript:void(0);" onclick="changeCode()">看不清?点我</a>
  14.  
    <script>
  15.  
     
  16.  
    function changeCode(www.yongshi123.cn ) {
  17.  
    document.getElementById("code").src = "code.jsp?d="+new Date().getTime();
  18.  
    }
  19.  
     
  20.  
    </script>
  21.  
    </body>
  22.  
    </html>

( 5)结果展示:

(6)算术验证码:算术验证码较之上面多了一个干扰线的设置,其余的没有特别的设置。

主要代码展示:

  1.  
    package com.www.jypt178.cn imooc.code;
  2.  
     
  3.  
    import java.awt.Color;
  4.  
    import java.awt.www.fengshen157.com Font;
  5.  
    import java.awt.Graphics2D;
  6.  
    import java.awt.image.BufferedImage;
  7.  
    import java.util.Random;
  8.  
     
  9.  
    import javax.imageio.ImageIO;
  10.  
    import javax.servlet.http.HttpServletResponse;
  11.  
     
  12.  
     
  13.  
    public class CapchCode {
  14.  
    /*
  15.  
    * 算术验证码的实现
  16.  
    */
  17.  
    public static String drawImageVerificate(HttpServletResponse response){
  18.  
    //设置长宽
  19.  
    int width=100,height=30;
  20.  
    //在内存中创建图片
  21.  
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  22.  
    // 创建图片的上下文
  23.  
    Graphics2D g = image.createGraphics();
  24.  
    // 创建随机对象,此随机对象主要运用于算术表达式的数字
  25.  
    Random random = new Random();
  26.  
    //随机设置背景颜色
  27.  
    g.setColor(getRandomColor(240,250));
  28.  
    g.setFont(new Font("微软雅黑", Font.PLAIN, 22));
  29.  
    //开始绘制
  30.  
    g.fillRect(0, 0, width, height);
  31.  
    g.setColor(getRandomColor(180,230));
  32.  
    //主要的部分,设置干扰线,绘制线条到干扰线中
  33.  
    for(int i=0;i<10;i++){
  34.  
    int sx = random.nextInt(width);
  35.  
    int sy = random.nextInt(height);
  36.  
    int dx = random.nextInt(60);
  37.  
    int dy = random.nextInt(60);
  38.  
    g.drawLine(sx,sy, dx, dy);
  39.  
    }
  40.  
    // 对算术表达式的拼接
  41.  
    int num1 = (int)(Math.random()*10+1);
  42.  
    int num2 = (int)(Math.random()*10+1);
  43.  
    int result=0;
  44.  
    int fuhao = random.nextInt(3);
  45.  
    String fuhaostr = "";
  46.  
    switch (fuhao) {
  47.  
    case 1:
  48.  
    result = num1+num2;
  49.  
    fuhaostr = num1+" + "+num2+" = ?";
  50.  
    break;
  51.  
    case 2:
  52.  
    result = num1 - num2 ;
  53.  
    fuhaostr = num1+" - "+num2+" = ?";
  54.  
    case 3:
  55.  
    result = num1 * num2;
  56.  
    fuhaostr = num1 +" * "+num2+" = ?";
  57.  
    break;
  58.  
    }
  59.  
     
  60.  
    // 设置随机颜色
  61.  
    g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110),20+random.nextInt(110)));
  62.  
    // 绘制表达式
  63.  
    g.drawString(fuhaostr, 5, 25);
  64.  
    //结束绘制
  65.  
    g.dispose();
  66.  
    try{
  67.  
    //输出图片到页面
  68.  
     
  69.  
    ImageIO.write(image, "JPEG", response.getOutputStream());
  70.  
    }catch(Exception e){
  71.  
    e.printStackTrace();
  72.  
    return null;
  73.  
    }
  74.  
    return null;
  75.  
    }
  76.  
    public static Color getRandomColor(int fa,int bc){
  77.  
    if(fa>255)fa=255;
  78.  
    if(bc>255)bc=255;
  79.  
     
  80.  
    Random random = new Random();
  81.  
    int r = fa +random.nextInt(bc-fa);
  82.  
    int g = fa +random.nextInt(bc-fa);
  83.  
    int b = fa +random.nextInt(bc-fa);
  84.  
    return new Color(r,g,b);
  85.  
    }
  86.  

--------------------- 本文来自 AYZXX 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/AYZXX/article/details/82907262?utm_source=copy

javaweb-简单的验证码和算术验证码的更多相关文章

  1. JAVA整合kaptcha生成验证码 (字母验证码和算术验证码)

    引入maven <!--图片验证码--> <dependency> <groupId>com.github.penggle</groupId> < ...

  2. windows下简单验证码识别——完美验证码识别系统

    此文已由作者徐迪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 讲到验证码识别,大家第一个可能想到tesseract.诚然,对于OCR而言,tesseract确实很强大,自带 ...

  3. C#简单的四位纯数字验证码

    验证码练手,整型.四位验证码 大体意思就是:四位纯数字验证,只要验证不成功就无限验证 刚开始在纠结怎么让整个过程循环起来,什么循环放到最外层,其实就是一个循环,看来自己的循环练习的还是不够多,不够灵活 ...

  4. 简单的Session案例 —— 一次性验证码

    一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码,其原理与利用Session防止表单重复提交的原理基本一样,只是将表单标识号变成了验证码的形式,并且要求用户将提示的验证码手工填写进一个 ...

  5. 以java实现的一个简单登录界面(带验证码)

    本文参考于:https://blog.csdn.net/wyf2017/article/details/78831744 https://blog.csdn.net/MengKun822/articl ...

  6. 如何使用深度学习破解验证码 keras 连续验证码

    在实现网络爬虫的过程中,验证码的出现总是会阻碍爬虫的工作.本期介绍一种利用深度神经网络来实现的端到端的验证码识别方法.通过本方法,可以在不切割图片.不做模板匹配的情况下实现精度超过90%的识别结果. ...

  7. PHP算式验证码和汉字验证码的实现方法

    在PHP网站开发中,验证码可以有效地保护我们的表单不被恶意提交,但是如果不使用算式验证码或者汉字验证码,仅仅使用简单的字母或者数字验证码,这样的验证码方案真的安全吗? 大家知道简单数字或者字母验证码很 ...

  8. 从12306网站新验证码看Web验证码设计与破解

    2015年3月16日,铁路官方购票网站12306又出新招,在登录界面推出了全新的验证方式,用户在填写好登录名和密码之后,还要准确的选取图片验证码才能登陆成功.据悉,12306验证码改版后,目前所有抢票 ...

  9. tornado web高级开发项目之抽屉官网的页面登陆验证、form验证、点赞、评论、文章分页处理、发送邮箱验证码、登陆验证码、注册、发布文章、上传图片

    本博文将一步步带领你实现抽屉官网的各种功能:包括登陆.注册.发送邮箱验证码.登陆验证码.页面登陆验证.发布文章.上传图片.form验证.点赞.评论.文章分页处理以及基于tornado的后端和ajax的 ...

随机推荐

  1. python解析xml实例

    如下,一个银行卡打标签后导出的数据 <?xml version="1.0" encoding="ISO-8859-1"?> <annotati ...

  2. ACM博弈论基础

    博弈论的题目有如下特点: 有两名选手 两名选手交替操作,每次一步,每步都在有限的合法集合中选取一种进行 在任何情况下,合法操作只取决于情况本身,与选手无关 游戏败北的条件为:当某位选手需要进行操作时, ...

  3. Array - RemoveDuplicatesfromSortedArray

    /** * 无额外空间,只要前n个是不重复的就行,不需要修改后面的数字 * @param nums 已排序的数组 * @return 去除重复数字后的长度 */ public int removeDu ...

  4. 2018.2.14 Java中的哈夫曼编码

    概念 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造 ...

  5. php常见验证

    /** * 文件上传 * @param $file 要上传的文件 * @param $size 大小设置 * @param $ext 文件类型 * @return bool 是否上传成功 */func ...

  6. 采用maven 对tomcat 进行自动部署

    在工作过程中经常会遇到项目频繁发不到额过程,而且在这个过程中会一直进行一些简单但是繁琐的重复性工程 1.打war 包 2.停掉tomcat 3.copy war 包 4.启动tomcat 听说mave ...

  7. eclipse 中main()函数中的String[] args如何使用?通过String[] args验证账号密码的登录类?静态的主方法怎样才能调用非static的方法——通过生成对象?在类中制作一个方法——能够修改对象的属性值?

    eclipse 中main()函数中的String[] args如何使用? 右击你的项目,选择run as中选择 run configuration,选择arguments总的program argu ...

  8. 关于UINavigationController的一些技巧

    未自定义任何东西的导航条效果如下: 1.自定义了 leftBarButtonItem 之后,左滑返回手势失效了,解决办法: self.navigationController.interactiveP ...

  9. python入门:简单模拟登陆时UTF-8转换成GBK编码

    #!/usr/bin/env python # -*- coding:utf-8 -*- """ 给变量x赋值为字符串‘请输入用户名:’ 变量x_unicode的赋值等于 ...

  10. MySQL创建根据经纬度计算距离的函数

    按照经纬度计算距离 日常开发中,特别是做微信项目时,经常会遇到根据用户地理位置来展示附近商家的功能,通常解决这种问题的思路是,后台设置商家的经纬度,然后再根据前台传的经纬度进行计算,具体经纬度转换以及 ...