在许多网页中咱们均可以看到验证码的存在,验证码就是用来进行人机识别的,防止脚本或爬虫无限制地请求网页致使资源浪费,本篇博客就是介绍如何在Spring和Springboot中配置验证码模块。html
本博客使用的验证码包wiki地址https://code.google.com/archive/p/kaptcha/前端
首先在Maven中导入使用验证码所须要使用到的包java
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
复制代码
接着咱们进入Web.xml,来配置验证码相关的Servlet和具体的参数,就按照普通Servlet的配置方法,Servlet的类名为com.google.code.kaptcha.servlet.KaptchaServlet,在servlet-mapping中配置/Kaptcha截获验证码请求到Servlet,最后在Servlet中配置init-param参数。git
<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>125</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>
复制代码
在前端网页里只要向'项目地址/Kaptcha'发起请求就能够得到验证码了,具体代码以下:github
<img id="captcha_img" alt="点击更换" title="点击更换" onclick="changeVerifyCode(this)" src="../Kaptcha" />
复制代码
因为随机产生的验证码可能不是很清楚,因此最好加一个点击事件点击验证码就能够更换一张验证码,js代码以下:后端
function changeVerifyCode(img) {
img.src="../Kaptcha?"+Math.floor(Math.random()*100);
}
复制代码
用户填写了验证码,向服务器发起了request,这个request就包含了用户输入的验证码,后台的工做就是须要验证验证码是否填写正确了,若是填写错误则须要当即返回错误信息告知用户,验证码的正确内容是存在session的Constants.KAPTCHA_SESSION_KEY中,因此咱们只须要取出正确的验证码内容和用户输入的验证码内容就能够完成验证。服务器
public class CodeUtil {
public static boolean checkVerifyCode(HttpServletRequest request) {
String verifyCodeExpected= (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
String verifyCodeActual = HttpServletRequestUtil.getString(request, "verifyCodeActual");
if (verifyCodeActual == null || !verifyCodeActual.toLowerCase().equals(verifyCodeExpected.toLowerCase()))
{
return false;
}
return true;
}
}
复制代码
能够写一个工具类来复用代码session
SpringBoot的配置其实和Spring的配置是差很少的,只不过SpringBoot崇尚去xml化,以上全部在xml上书写的内容都须要在代码中配置。app
首先在application.properties中把要用的参数信息提早写好dom
#Kaptcha相关
kaptcha.border=no
kaptcha.textproducer.font.color=red
kaptcha.image.width=135
kaptcha.textproducer.char.string=ACDEFHKPRSTWX345679
kaptcha.image.height=50
kaptcha.textproducer.font.size=43
kaptcha.noise.color=black
kaptcha.textproducer.char.length=4
kaptcha.textproducer.font.names=Arial
复制代码
其次咱们须要在@Configuration配置文件中自行配置一个Servlet来取代以前在Web.xml中的操做,其实具体操做很简单也和以前很类似,声明一个映射特定路径的 Servlet ,或是须要配置初始化参数的话,须要使用ServletRegistrationBean
。
@Bean(name="captchaProducer")
public ServletRegistrationBean servletRegistrationBean() throws ServletException {
ServletRegistrationBean servlet = new ServletRegistrationBean(new KaptchaServlet(), "/Kaptcha");
servlet.addInitParameter("kaptcha.border", border);
servlet.addInitParameter("kaptcha.textproducer.font.color", fcolor);
servlet.addInitParameter("kaptcha.image.width", width);
servlet.addInitParameter("kaptcha.textproducer.char.string", cString);
servlet.addInitParameter("kaptcha.image.height", height);
servlet.addInitParameter("kaptcha.textproducer.font.size", fsize);
servlet.addInitParameter("kaptcha.noise.color", nColor);
servlet.addInitParameter("kaptcha.textproducer.char.length", clength);
servlet.addInitParameter("kaptcha.textproducer.font.names", fnames);
return servlet;
}
复制代码
至此SpringBoot的验证码就配置完了。