验证码Kaptcha的使用「建议收藏」

验证码Kaptcha的使用「建议收藏」Kaptcha是一个非常实用的验证码生成工具,可以通过配置生成多样化的验证码。以图片的形式显示,从而无法进行复制粘贴。

大家好,又见面了,我是你们的朋友全栈君。

引言

Kaptcha是一个非常实用的验证码生成工具,可以通过配置生成多样化的验证码。以图片的形式显示,从而无法进行复制粘贴。

1.引入Maven依赖

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

2.编写Servlet

接着我们需要在web.xml中编写一个servlet,该servlet的作用就是去生成一个验证码,主要指指定了验证码的样式,字体等等

<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>ACDEFHKPRSTWX345678</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>
  <servlet>

3.添加验证码控件

接着我们需要在前端html页面里添加验证码控件,同时设置点击验证码更新的设置

<!-- 验证码(避免重复提交) kaptcha -->
        <li>
          <div class="item-content">
            <div class="item-inner">
              <div class="item-title label">验证码</div>
              <input type="text" id="j-kaptcha" placeholder="验证码">
              <div class="item-input">
                <img id="kaptcha-img" alt="点击更换" title="点击更换"
                 οnclick="changeVerifyCode(this)" src="../Kaptcha" />
              </div>
            </div>
          </div>
        </li>

对应的Javascript中

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

4.Javascript的编写

此部分的作用是接收前端的数据,并将其传输到后台中去

var verifyCodeActual = $('#j-kaptcha').val();
			if(!verifyCodeActual) {
				$.toast('请输入验证码');
				return;
			}
			formData.append('verifyCodeActual', verifyCodeActual);
			$.ajax({
				url: registerShopUrl,
				type: 'POST',
				data: formData,
				contentType: false,
				processData: false,
				cache: false,
				success: function(data) {
					if(data.success) {
						$.toast('提交成功!');
					}else {
						$.toast('提交失败!' + data.errMsg);
					}
					$('kaptcha-img').click();
				}
			});

5.后台的完善

@RequestMapping(value = "/registershop", method = RequestMethod.POST)
	@ResponseBody
	private Map<String, Object> registerShop(HttpServletRequest request) {
		Map<String, Object> modelMap = new HashMap<String, Object>();
		/*进行验证码比对,并将比对结果返回给前端*/
		if(!CodeUtil.checkVerifyCode(request)) {
			modelMap.put("success", false);
			modelMap.put("errMsg", "验证码错误");
			return modelMap;
		}

其中,考虑到验证码部分可能后面还会用到,故将其设置为公共类

public class CodeUtil {
	public static boolean checkVerifyCode(HttpServletRequest request) {
		String verifyCodeExpected = (String)request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
		String verifyCodeActual = HttpServletRequestUtil.getString(request, "verifyCodeActual");
		if(verifyCodeActual == null || !verifyCodeActual.equals(verifyCodeExpected)) {
			return false;
		}
		return true;
	}}

6.显示效果

验证码Kaptcha的使用「建议收藏」

7.遇到的问题

当然在开始引入kaptcha的jar包时,出现下载失败的情况,也就是如下情况

验证码Kaptcha的使用「建议收藏」

后来试了很多方法,最后发现在settings.xml的文件中增加镜像是一种比较好的方式,当时选择的是阿里云的Maven仓库镜像

<mirrors>
    <!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
  -->
    <mirror>
      <id>nexus-aliyun</id>
      <mirrorOf>*</mirrorOf>
      <name>Nexus aliyun</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
     
  </mirrors>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150379.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CSS3之border-radius圆角

    CSS3之border-radius圆角

    2021年9月21日
    48
  • python贪吃蛇代码_python 贪吃蛇

    python贪吃蛇代码_python 贪吃蛇importpygamefrompygame.localsimport*fromsysimportexitfrompygame.colorimportTHECOLORSimportrandomcellsize=20width=640height=480cellw=int(width/cellsize)cellh=int(height/ce…

    2022年8月10日
    13
  • 国内十大正规现货交易平台排名(2021版榜单)

    国内十大正规现货交易平台排名(2021版榜单)现货亦称实物,指可供出货、储存和制造业使用的实物商品。可供交割的现货可在近期或远期基础上换成现金,或先付货,买方在极短的期限内付款的商品的总称。期货的对称。随着互联网的出现,世界已慢慢变成地球村,建立在信息化基础上的现货电子交易走上新经济的舞台。现货电子交易(也称为大宗商品电子交易,或现货仓单交易)是以现货仓单为交易的标的物,采用计算机网络进行的集中竞价买卖,统一撮合成交,统一结算付款,价格行情实时显示的交易方式。国内不少投资者对现货交易还不是太了解,下面小编为您介绍“国内十大正规现货交易平台排名(20

    2022年6月15日
    58
  • java128陷阱

    java128陷阱public static void main(String[] args){ Integer a=128; Integer b=128; System.out.print(a==b);//false a=127; b=127; System.out.print(a==b);//true}为什么对于一个Integer来说,两个Integer都为128的时候通过判断为false,127时的却是true呢?其实这一切都是因为Java中的装箱

    2022年8月8日
    5
  • AV1 码流分析器的搭建

    AV1 码流分析器的搭建作为HEVC比较热门的继承者,AOM推进的AV1在2018年进入了大家的视野。研究AV1的新编码工具离不开一个强大的码流分析工具。AOM得益于开源社区的贡献,其码流分析工具也在同步的推出,给研究AV1新编码工具的小伙伴带来省去不少麻烦。本文主要简单介绍一下如何搭建一个本地的AV1码流分析工具以及在大家过程中遇到的问题。1.AV1码流分析工具简单介绍AV1码流分析工…

    2022年9月22日
    2
  • python3菜鸟教程笔记

    python3菜鸟教程笔记python2和python3的一些差异:*print函数变了,python3中的print函数必须要加括号*xrange函数合并到了range中,2到5的序列可以直接用range(2,5

    2022年7月6日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号