google kaptcha 验证码的使用

时间:2021-12-16 11:29:58

这边演示下idea+maven+servlet实现谷歌的kaptcha验证码的使用:

web.xml, 这边主要是kaptcha验证器,

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>validcode</servlet-name>
<servlet-class>ValidCode</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>validcode</servlet-name>
<url-pattern>/validcode</url-pattern>
</servlet-mapping> <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.border.color</param-name>
<param-value>105,179,90</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>100</param-value>
</init-param>
<init-param>
<param-name>kaptcha.image.height</param-name>
<param-value>45</param-value>
</init-param>
<init-param>
<param-name>kaptcha.textproducer.font.size</param-name>
<param-value>35</param-value>
</init-param>
<!-- 配置session的存储的KEY -->
<init-param>
<param-name>kaptcha.session.key</param-name>
<param-value>session_code</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>宋体,楷体,微软雅黑</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>kaptcha</servlet-name>
<url-pattern>/code</url-pattern>
</servlet-mapping>
</web-app>

然后是maven依赖,引入kaptcha, 阿里的快速json,以及apache的io流,

因为kaptcha依赖我这边下不下来所以就下载下来放在lib里面再导入,如图:

google kaptcha 验证码的使用

maven依赖如下:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.linewell</groupId>
<artifactId>Kaptcha</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging> <name>Kaptcha Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>com.google.code</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/kaptcha-2.3.2.jar</systemPath>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies> <build>
<finalName>Kaptcha</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

前端的jsp代码如下:

<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> </head>
<body>
<div style="width: 100%; margin-top: 30px;" align="center" >
<div class="form-inline">
<input type="text" id="text" class="form-control" style="width: 150px"/>
<img id="img" src="/code" alt="picture dismiss" />
</div>
<div class="form-inline" style="margin-top: 15px;"><input type="button" id="sub" value="submit" class="btn-primary" style="width: 100px;"/></div>
</div> <script>
$(function () {
$("#img").bind("click", function () {
$("#img").attr("src", "/code?"+new Date().getTime());
console.log($('#img').attr("src"));
}); $("#sub").click(function () { var input = $("#text").val();
console.log(input); var data = {};
data.code = input;
$.ajax({
type:"post",
dataType: "json",
url : "/validcode",
contentType:"application/json; charset=utf-8",
data: JSON.stringify(data),
success: function (t) {
alert(t.msg);
},
failure: function (data) {
console.log(data);
}
}); });
});
</script> </body>
</html>

后台测试的servlet如下:

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.IOUtils; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter; public class ValidCode extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException
{
InputStream inputStream = request.getInputStream();
String bodyInfo = IOUtils.toString(inputStream, "utf-8");
System.out.println(bodyInfo);
JSONObject jsonObject = JSONObject.parseObject(bodyInfo);
String code = jsonObject.getString("code");
String attribute = (String) request.getSession().getAttribute("session_code");
Data data = new Data();
if(code.equals(attribute)){
System.out.println("验证码正确!");
data.setMsg("success");
}else {
System.out.println("验证码输入错误");
data.setMsg("fail");
}
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
String jsonString = JSONObject.toJSONString(data);
PrintWriter writer = response.getWriter();
writer.write(jsonString); }
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
} } class Data{
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}

最后的效果展示:

google kaptcha 验证码的使用