Kptcha生成验证码详解:

12 篇文章 0 订阅
8 篇文章 0 订阅

kaptcha是一款开源生成验证码的工具。不仅能让我们更方便的生成验证码,还能根据喜好提供对验证码的一系列变形。

引用依赖:

<!-- https://mvnrepository.com/artifact/com.github.penggle/kaptcha -->
<dependency>
    <groupId>com.github.penggle</groupId>
    <artifactId>kaptcha</artifactId>
    <version>2.3.2</version>
</dependency>

前端使用kptcha:

首先做好配置工作,kptcha依赖,如果是ssm还要配置文件上传解析器等等这些就先不说,都能找到相关资料,这里讲主要的工作原理和必要步骤

1:在web.xml配置好kptcha(分配路由):

servlet>
        <servlet-name>Kaptcha</servlet-name>
        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
        <!--是否有边框-->
        <init-param>
            <param-name>kaptcha.border</param-name>
            <param-value>no</param-value>
        </init-param>
        <!--字体颜色-->
        <init-param>
            <param-name>kaptcha.textproducer.font.color</param-name>
            <param-value>red</param-value>
        </init-param>
        <!--图片宽度-->
        <init-param>
            <param-name>kaptcha.image.width</param-name>
            <param-value>135</param-value>
        </init-param>
        <!--使用哪些字符生成验证码-->
        <init-param>
            <param-name>kaptcha.textproducer.char.string</param-name>
            <param-value>ACDEFHKPRSTWX345679</param-value>
        </init-param>
        <!--图片高度-->
        <init-param>
            <param-name>kaptcha.image.height</param-name>
            <param-value>50</param-value>
        </init-param>
        <!--字体大小-->
        <init-param>
            <param-name>kaptcha.textproducer.font.size</param-name>
            <param-value>43</param-value>
        </init-param>
        <!--干扰线的颜色-->
        <init-param>
            <param-name>kaptcha.noise.color</param-name>
            <param-value>black</param-value>
        </init-param>
        <!--字符个数-->
        <init-param>
            <param-name>kaptcha.textproducer.char.length</param-name>
            <param-value>4</param-value>
        </init-param>
        <!--字体-->
        <init-param>
            <param-name>kaptcha.textproducer.font.names</param-name>
            <param-value>Arial</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>Kaptcha</servlet-name>
        <url-pattern>/Kaptcha</url-pattern>
    </servlet-mapping>

2:在前端中使用kptcha:

<img id="captcha_img" alt="点击更换" title="点击更换"
     onclick="changeVerifyCode(this)" src="../Kaptcha" />

这里src=”../Kaptcha“,是因为我的html在WEB-INF目录下,所以得返回到application Context下,前端显示如下:

 

 changeVerifyCode(this)是功能是:点击图片更换验证码:

function changeVerifyCode(img) {
   img.src = "../Kaptcha?" + Math.floor(Math.random() * 100);
}

这里的"?" 按我原理理解应该是有参数才行的,看了老师的讲解原理是:这样做是可以清理缓存,比如在引入一个js文件,如果js文件名不改变,需要清理缓存才会生效,所有加上"?+随机数"后,就可以达到清理缓存的效果,验证码不能留缓存,茅舍顿开。

这样子就达到我们打开就有验证码,点击就更换验证码的效果。

后端验证:

package com.huang.util;

import com.google.code.kaptcha.Constants;

import javax.servlet.http.HttpServletRequest;

/**
 * @ClassName CodeUtil
 * @Description 验证码校验工具类
 * @Author hjj
 * @Date 2022/3/3
 */
public class CodeUtil {
    public static boolean checkVerifyCode(HttpServletRequest request){
    	//看、kaptcha生成的验证码
         String verifyCodeExpected= (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
       	//用户输入的验证码
         String verifyCodeActula=request.getParameter("verifyCodeActual");
        if (verifyCodeActula==null||!verifyCodeExpected.equals((verifyCodeActula))){
            return false;
        }
        return true;
    }

}

这里verifyCodeExpected是获取kptcha生成的验证码(也就是那张图片),源代码待会分析,为啥是这样获取。

verifyCodeActula则是前端传回的参数。

个人简单分析了一下kptcha的原理:

首先我们看看为什么要去web.xml注册的kaptcha:

<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>

这是web.xml的绑定,接下来我们看KaptchaServlet类。

 可以看到这里KaptchaServlet类是实现了servlet,这就是为什么我们需要在web.xml中注册绑定了,因为servlet如果不注册web是访问不到的,所以我们为KaptchaServlet分配了路由。

KaptchaServlet doget()方法:

 这里我们可以请求后会往session中写入验证码,而key则需要是这段代码

this.sessionKeyValue = config.getSessionKey();

我们去看跟踪过去看看

 可以看到返回的是KAPTCHA_SESSION_KEY

让我们看看kaptcha中Constans类

 所以我们session存在一个(KAPTCHA_SESSION_KEY,capText)的键值对,这里就很好解释了我们在想要对用户输入的验证码进行比对的时候为什么要写成

request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);

这样就能从Session中获取到生成的验证码了,而且每次请求后都会在Session更新新的验证码。

最后一些Kptcha参数介绍:

Constant

描述

默认值

kaptcha.border

图片边框,合法值:yes , no

yes

kaptcha.border.color

边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue.

black

kaptcha.border.thickness

边框厚度,合法值:>0

1

kaptcha.image.width

图片宽

200

kaptcha.image.height

图片高

50

kaptcha.producer.impl

图片实现类

com.google.code.kaptcha.impl.DefaultKaptcha

kaptcha.textproducer.impl

文本实现类

com.google.code.kaptcha.text.impl.DefaultTextCreator

kaptcha.textproducer.char.string

文本集合,验证码值从此集合中获取

abcde2345678gfynmnpwx

kaptcha.textproducer.char.length

验证码长度

5

kaptcha.textproducer.font.names

字体

Arial, Courier

kaptcha.textproducer.font.size

字体大小

40px

kaptcha.textproducer.font.color

字体颜色,合法值: r,g,b  或者 white,black,blue.

black

kaptcha.textproducer.char.space

文字间隔

2

kaptcha.noise.impl

干扰实现类

com.google.code.kaptcha.impl.DefaultNoise

kaptcha.noise.color

干扰颜色,合法值: r,g,b 或者 white,black,blue.

black

kaptcha.obscurificator.impl

图片样式:

水纹com.google.code.kaptcha.impl.WaterRipple

鱼眼com.google.code.kaptcha.impl.FishEyeGimpy

阴影com.google.code.kaptcha.impl.ShadowGimpy

com.google.code.kaptcha.impl.WaterRipple

kaptcha.background.impl

背景实现类

com.google.code.kaptcha.impl.DefaultBackground

kaptcha.background.clear.from

背景颜色渐变,开始颜色

light grey

kaptcha.background.clear.to

背景颜色渐变,结束颜色

white

kaptcha.word.impl

文字渲染器

com.google.code.kaptcha.text.impl.DefaultWordRenderer

kaptcha.session.key

session key

KAPTCHA_SESSION_KEY

kaptcha.session.date

session date

KAPTCHA_SESSION_DATE

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RandomAccessFile是Java中一个用于读写文件的类,它可以在文件中随意移动指针,实现对文件的随机访问。与其他文件读写类不同的是,RandomAccessFile既可以读取文件,也可以写入文件,而且可以在文件中任意位置进行读写操作。 RandomAccessFile类提供了一系列方法,包括读取和写入基本数据类型、读取和写入字节数组、读取和写入字符串、设置文件指针位置等等。通过这些方法,我们可以实现对文件的灵活读写操作。 需要注意的是,RandomAccessFile类只能操作文件,不能操作其他类型的数据源,如网络连接、内存等。同时,RandomAccessFile类也不是线程安全的,需要在多线程环境下使用时进行同步处理。 ### 回答2: RandomAccessFile是Java IO包中的一个类,它允许我们以随机读写方式访问文件的内容,即可以直接跳转并读写文件中任意位置处的数据。RandomAccessFile提供了对文件任意位置的读写操作,包括文件读取、文件写入以及对文件进行定位操作等。相对于FileInputStream和FileOutputStream,RandomAccessFile类的功能更加强大和灵活。 RandomAccessFile可以以只读、只写或读写的方式打开文件。当一个文件被打开后,我们可以通过getFilePointer方法获取当前指针的位置,并通过seek方法改变指针的位置。通过read和write方法我们可以读取和写入文件指针所在位置的数据,或者在指定位置插入新的数据,这使得RandomAccessFile类具有便捷的随机读写文件的功能。 在使用RandomAccessFile进行读写操作时,每次进行读写操作时都会将指针指向下一个位置。我们可以通过RandomAccessFile对象的getFilePointer方法获取当前指针的位置,也可以通过seek方法来定位指针的位置。 使用RandomAccessFile时,需要注意每种操作所要求的参数类型,如write方法需要传入byte数组、int、long等参数类型,而read方法需要传入byte数组参数等。同时,在操作RandomAccessFile时,我们还需要注意处理异常,如EOFException、IOException、IndexOutOfBoundsException等异常操作,以确保读写操作能够成功执行。 总之,RandomAccessFile是一种非常有用的文件读写类,它提供了随机读取文件的能力,方便了文件中任意位置的读写操作,同时也在一定程度上提高了文件的读写效率。当我们需要随机读取文件内容时,RandomAccessFile是一种非常值得使用的类。 ### 回答3: RandomAccessFile是Java中文件处理的一个重要类。它提供了对文件的读写、随机访问能力,可以读取和写入任意字节数组,还可以自由设置读写位置和文件指针位置。在很多情况下,使用RandomAccessFile比其他读写文件的方法更加方便和高效。 RandomAccessFile有两种模式:只读("r") 和读写("rw")。只读模式下可以读取文件并查找文件的指定位置,但不能修改文件内容;读写模式既可以读取文件的内容,又可以修改文件的内容。 RandomAccessFile的主要方法包括: read(): 从文件中读取一个字节,返回值在0-255之间 read(byte[] b): 从文件中读取一定数量的字节,存储到给定的字节数组b中 write(int b): 将指定的字节写入文件 write(byte[] b): 将指定的字节数组写入文件 getFilePointer(): 返回当前文件指针的位置 seek(long pos): 设置文件指针的位置 length(): 返回文件的长度 close(): 关闭RandomAccessFile类的对象 使用RandomAccessFile,可以在文件中任意位置插入数据、删除数据,也可以实现对文件内容的修改。例如,可以从文件开头写入数据,从中间删除数据,从结尾追加数据等。这种灵活性使得RandomAccessFile非常适合在许多需要对文件进行随机访问和修改的应用中使用,例如数据库、日志文件等。同时,RandomAccessFile的灵活性也带来了一些安全问题,因此在使用时要谨慎处理。 总之,RandomAccessFile是一个非常重要的Java文件处理类,具有读、写和随机访问文件内容的能力。在处理大型文件或需要对文件内容进行修改的应用中,使用RandomAccessFile能够提高程序的效率和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值