jcaptcha配置验证码
准备开始
首先导入jar包:jcaptcha-my-1.0
/**
* web 常量
* @author lx
*
*/
public abstract class Constants {
/** 用户 session 的 cookie 名称*/
public static final String SESSION_ID = "JSESSIONID";
}
第一步:创建SessionProvider接口
cn.itcast.common.web.session.SessionProvider
public interface SessionProvider {
public void setAttribute(HttpServletRequest request,String name ,Serializable value);
//获取Session中的值
public Serializable getAttribute(HttpServletRequest request,String name);
//退出登陆
public void logout(HttpServletRequest request,HttpServletResponse response);
//获取Session Id
public String getSessionId(HttpServletRequest request);
}
第二步:创建HttpSessionProvider实现类
cn.itcast.common.web.session.HttpSessionProvider
/**
* Session提供类
* @author lx
*
*/
public class HttpSessionProvider implements SessionProvider{
//往Session中设置值
public void setAttribute(HttpServletRequest request,String name ,Serializable value){
HttpSession session = request.getSession();
if(session != null){
session.setAttribute(name, value);
}
}
//获取Session中的值
public Serializable getAttribute(HttpServletRequest request,String name){
HttpSession session = request.getSession(false);
if(session != null){
return (Serializable) session.getAttribute(name);
}else{
return null;
}
}
//退出登陆
public void logout(HttpServletRequest request,HttpServletResponse response){
HttpSession session = request.getSession(false);
if(session != null){
session.invalidate();
}
Cookie c = new Cookie(Constants.SESSION_ID,null);
c.setMaxAge(0);
response.addCookie(c);
}
//获取Session Id
public String getSessionId(HttpServletRequest request){
return request.getRequestedSessionId();
}
}
第三步:创建classpath:config/utils.xml
<!-- session 提供类 -->
<bean id="sessionProvider" class="cn.itcast.common.web.session.HttpSessionProvider"/>
第四步:创建JcaptchaServlet
第五步:创建classpth:config/captcha.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-lazy-init="true">
<bean id="captchaService" class="com.octo.captcha.service.multitype.GenericManageableCaptchaService">
<constructor-arg index="0" ref="imageEngine"/>
<constructor-arg type="int" index="1" value="180"/>
<constructor-arg type="int" index="2" value="100000"/>
<constructor-arg type="int" index="3" value="75000"/>
</bean>
<bean id="imageEngine" class="com.octo.captcha.engine.GenericCaptchaEngine">
<constructor-arg index="0">
<list>
<ref bean="captchaFactory"/>
</list>
</constructor-arg>
</bean>
<bean id="captchaFactory" class="com.octo.captcha.image.gimpy.GimpyFactory">
<constructor-arg>
<ref bean="wordgen"/>
</constructor-arg>
<constructor-arg>
<ref bean="wordtoimage"/>
</constructor-arg>
</bean>
<bean id="wordgen" class= "com.octo.captcha.component.word.wordgenerator.RandomWordGenerator">
<!--可选字符-->
<constructor-arg>
<value>aabbccddeefgghhkkmnnooppqqsstuuvvwxxyyzz</value>
</constructor-arg>
</bean>
<bean id="wordtoimage" class="com.octo.captcha.component.image.wordtoimage.ComposedWordToImage">
<constructor-arg index="0">
<ref bean="fontGenRandom"/>
</constructor-arg>
<constructor-arg index="1">
<ref bean="backGenUni"/>
</constructor-arg>
<constructor-arg index="2">
<ref bean="decoratedPaster"/>
</constructor-arg>
</bean>
<bean id="fontGenRandom" class="com.octo.captcha.component.image.fontgenerator.RandomFontGenerator">
<!--最小字体-->
<constructor-arg index="0">
<value>26</value>
</constructor-arg>
<!--最大字体-->
<constructor-arg index="1">
<value>34</value>
</constructor-arg>
<constructor-arg index="2">
<list>
<bean class="java.awt.Font">
<constructor-arg index="0"><value>Arial</value></constructor-arg>
<constructor-arg index="1"><value>0</value></constructor-arg>
<constructor-arg index="2"><value>32</value></constructor-arg>
</bean>
</list>
</constructor-arg>
</bean>
<bean id="backGenUni" class="com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator">
<!--背景宽度-->
<constructor-arg index="0">
<value>110</value>
</constructor-arg>
<!--背景高度-->
<constructor-arg index="1">
<value>50</value>
</constructor-arg>
</bean>
<bean id="decoratedPaster" class="com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster">
<!--最大字符长度-->
<constructor-arg type="java.lang.Integer" index="0">
<value>4</value>
</constructor-arg>
<!--最小字符长度-->
<constructor-arg type="java.lang.Integer" index="1">
<value>4</value>
</constructor-arg>
<!--文本颜色-->
<constructor-arg index="2">
<ref bean="colorGen"/>
</constructor-arg>
<!--文本混淆-->
<constructor-arg index="3">
<list>
<!--<ref bean="baffleDecorator"/>-->
</list>
</constructor-arg>
</bean>
<bean id="baffleDecorator" class="com.octo.captcha.component.image.textpaster.textdecorator.BaffleTextDecorator">
<constructor-arg type="java.lang.Integer" index="0"><value>1</value></constructor-arg>
<constructor-arg type="java.awt.Color" index="1"><ref bean="colorWrite"/></constructor-arg>
</bean>
<bean id="colorGen" class="com.octo.captcha.component.image.color.SingleColorGenerator">
<constructor-arg type="java.awt.Color" index="0">
<ref bean="colorBlack"/>
</constructor-arg>
</bean>
<bean id="colorWrite" class="java.awt.Color">
<constructor-arg type="int" index="0">
<value>255</value>
</constructor-arg>
<constructor-arg type="int" index="1">
<value>255</value>
</constructor-arg>
<constructor-arg type="int" index="2">
<value>255</value>
</constructor-arg>
</bean>
<bean id="colorBlack" class="java.awt.Color">
<constructor-arg type="int" index="0">
<value>50</value>
</constructor-arg>
<constructor-arg type="int" index="1">
<value>50</value>
</constructor-arg>
<constructor-arg type="int" index="2">
<value>50</value>
</constructor-arg>
</bean>
</beans>
第六步:编写JcaptchaServlet
/**
* 提供验证码图片的Servlet
*/
@SuppressWarnings("serial")
public class JcaptchaServlet extends HttpServlet {
public static final String CAPTCHA_IMAGE_FORMAT = "jpeg";
private ImageCaptchaService captchaService;
private SessionProvider session;
@Override
public void init() throws ServletException {
WebApplicationContext appCtx = WebApplicationContextUtils
.getWebApplicationContext(getServletContext());
captchaService = (ImageCaptchaService) BeanFactoryUtils
.beanOfTypeIncludingAncestors(appCtx, ImageCaptchaService.class);
session = (SessionProvider) BeanFactoryUtils
.beanOfTypeIncludingAncestors(appCtx, SessionProvider.class);
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
byte[] captchaChallengeAsJpeg = null;
// the output stream to render the captcha image as jpeg into
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
try {
// get the session id that will identify the generated captcha.
// the same id must be used to validate the response, the session id
// is a good candidate!
String captchaId = session.getSessionId(request);
BufferedImage challenge = captchaService.getImageChallengeForID(
captchaId, request.getLocale());
// Jimi.putImage("image/jpeg", challenge, jpegOutputStream);
ImageIO.write(challenge, CAPTCHA_IMAGE_FORMAT, jpegOutputStream);
} catch (IllegalArgumentException e) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
} catch (CaptchaServiceException e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return;
}
// catch (JimiException e) {
// response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
// return;
// }
captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
// flush it in the response
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/" + CAPTCHA_IMAGE_FORMAT);
ServletOutputStream responseOutputStream = response.getOutputStream();
responseOutputStream.write(captchaChallengeAsJpeg);
responseOutputStream.flush();
responseOutputStream.close();
}
}
第七步:配置web.xml
<!-- 配置Jcaptcha 验证码-->
<servlet>
<servlet-name>jcaptcha</servlet-name>
<servlet-class>cn.itcast.common.captcha.JcaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>jcaptcha</servlet-name>
<url-pattern>/captcha.svl</url-pattern>
</servlet-mapping>
第八步:编写登陆页面front_page/buyer/login.jsp
<li>
<label for="captcha">验证码:</label>
<span class="bg_text small">
<input type="text" id="captcha" name="captcha" maxLength="7"/>
</span>
<img src="/captcha.svl" οnclick="this.src='/captcha.svl?d='+new Date()" class="code" alt="换一张" /><a href="javascript:void(0);" οnclick="$('.code').attr('src','/captcha.svl?d='+new Date())" title="换一张">换一张</a>
</li>
6. 提交登录表单后,校验
- package personal.hutao.controller;
- import javax.servlet.http.HttpServletRequest;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.ResponseBody;
- import com.octo.captcha.service.image.ImageCaptchaService;
- @RequestMapping("/login")
- @Controller
- public class LoginController {
- @Autowired
- private ImageCaptchaService imageCaptchaService;
- @RequestMapping(value = "/doLogin", method = RequestMethod.POST)
- @ResponseBody
- public Boolean login(String username, String password, String captcha, HttpServletRequest request) {
- Boolean result = Boolean.FALSE;
- Boolean isResponseCorrect = imageCaptchaService.validateResponseForID(request.getSession().getId(), captcha);
- if (isResponseCorrect) {
- // 继续校验用户名密码等..
- }
- return result;
- }
- }
OK,至此就在Spring/SpringMVC环境下实现了Jcaptcha,赶快试试吧~
jcaptcha配置验证码相关推荐
- teamviewer一直验证账户_顶象:App客户端配置验证码的四大应用效果
随着移动互联网的飞速发展,现在很多问题都可以通过一部手机就搞定.比如当你需要购物时有各种电商可以随时满足你采买需求,当你饿了想要吃东西的时候,可以足不出户手机下单直接点外卖到家,还有当你准备外出旅游时 ...
- google captcha验证码生成工具使用教程 样式配置
1.引入依赖 <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha& ...
- Spring Boot 配置Kaptcha(谷歌验证码工具)(生成验证码、验证验证码)
1 Kaptcha 1.1 Kaptcha简介 Kaptcha 是一个扩展自simplecaptcha的验证码库,默认情况下,Kaptcha非常易于设置和使用,并且默认输出会产生一个很难验证的验证码. ...
- SSM框架下实现验证码图片验证功能(源码)
SSM框架下实现验证码图片验证功能 背景图片资源路径 https://download.csdn.net/download/hero_qhz/10322064 一.首先,在pom里面加上需要用的资源j ...
- JavaWeb - 验证码
为什么要学习验证码? 1.可以防止恶意破解密码.刷票.论坛灌水. 2.有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试. 3.实际上用验证码是现在很多网站通行的方式,我们利 ...
- Spring Security过滤器就该这么配置!
大家好,我是推干货的DD! 今早看到小胖哥更新干货了,关注Spring Security的小伙伴,不可以错过这篇哦! 以前胖哥带大家用Spring Security过滤器实现了手机验证码认证,今天我们 ...
- Spring Security 实战干货:从零手写一个验证码登录
1. 前言 前面关于Spring Security胖哥又写了两篇文章,分别图文并茂地介绍了UsernamePasswordAuthenticationFilter和 AuthenticationMan ...
- php验证码背景图是数字,ThinkPHP5.0.20验证码背景图片
tp5配置验证码相关问题 一.验证码背景图片及tp中文验证码 5.0.1及以上支持者在应用配置目录(application)下面 extra 子目录内配置captcha.php文件: 配置参数如下: ...
- Django中示例验证码的实现总结
验证码 在用户注册.登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻业务服务器.数据库服务器的压力. 1)安装包Pillow3.4.1. 1 pip inst ...
最新文章
- 关于重装系统或还原系统
- Python数据结构学习笔记——树和图
- 简单了解线程和进程、多进程和多线程、并发和并行的区别
- 获取选中_【字节】如何实现选中复制的功能
- Python-WSGI协议如何实现?
- 20165208 课下作业
- python 三维数组_NumPy处理图像不香吗?我用Python把秋日里最美的景色做成了这种效果~...
- PAT 00-自测1. 打印沙漏(20)
- SQL Server-外部联接基础
- java虚拟机内存不足,“Could not create the Java Virtual Machine”问题解决方案
- 销售订单无法使用折扣(其他可以正常使用)
- html5读取umd,教程:使用umd、commonjs和es三种模式制作自己的React 组件(库)
- android仿微信的开门效果
- iOS安装脱壳后的ipa
- 姓杨取名:杨姓女孩文雅有寓意的名字,真的是万里挑一
- 切比雪夫不等式例题讲解_13.初中数学:怎么解一元一次不等式?把解集表示在数轴上,基础训练...
- ros学习记录1 Hello World 使用c++
- 苹果呼叫转移设置不了_怎么设置别人电话打不进来
- docker registry 2 私有仓库镜像删除方法
- thinkphp图片拖动验证码