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" onclick="this.src='/captcha.svl?d='+new Date()" class="code" alt="换一张" /><a href="javascript:void(0);" onclick="$('.code').attr('src','/captcha.svl?d='+new Date())" title="换一张">换一张</a>
</li>
jcaptcha配置验证码的更多相关文章
- Confluence 6 为登录失败编辑,禁用和配置验证码
在默认的情况下,验证码将会在失败登录次数达到的时候显示. 如果为登录失败编辑,禁用和配置验证码: 在屏幕的右上角单击 控制台按钮 ,然后选择 General Configuration 链接. 在左侧 ...
- Confluence 6 配置验证码(Captcha)来防止垃圾
如果你的 Confluence 站点是对公众开放的(允许匿名用户使用,添加评论,创建页面等),你可能会发现你的站点会被自动创建很多垃圾页面,评论或者其他垃圾内容. 你可以配置让 Confluence ...
- JCaptcha做验证码遇到的问题引出的思考
JCaptcha用来做用户登录时期的验证码的,但是今天将开放的应用系统部署到生产环境的时候,遇到了问题,总是提示验证码不对.后台报出来下面的错误: com.octo.captcha.service.C ...
- kaptcha验证码使用
参数配置: Constant 描述 默认值 kaptcha.border 图片边框,合法值:yes , no yes kaptcha.border.color 边框颜色,合法值: r,g,b (and ...
- SSH实战 · SSH项目中怎么玩验证码
大致思路与之前servlet中玩验证码类似,生成随机数,产生干扰线,画到图片上,保存到session中. 本人习惯用的时候专门写一个验证码的action:CheckImgAction. step1: ...
- tinkphp验证码的使用
页面显示验证码: <div class="input-group has-feedback "> <input id="yzm" type=& ...
- tinkphp登录验证码的使用
登录和验证(控制器) <?php namespace Come\Controller; use Think\Controller; class RenController extends Con ...
- LUA+resty 搭建验证码服务器
使用Lua和OpenResty搭建验证码服务器 雨客 2016-04-08 16:38:11 浏览2525 评论0 云数据库Redis版 摘要: Lua下有个Lua-GD图形库,通过简单的Lua语句就 ...
- thinkphp验证码的实现
两种验证码验证实现,一种直接在form表单提交按钮实现验证,一种使用ajax传递参数实现验证: 1.直接在form表单提交按钮实现验证,在控制器VerifyController.class.php中写 ...
随机推荐
- Win10 VirtualBox虚拟机搭建lnmp环境
之前用的是vagrant+VirtualBox搭建的环境,因为是windows系统动不动就报错,打不开环境,所以还是老老实实换了虚拟机哎.... 版本: VirtualBox 5.1.34 xsh ...
- Hello,移动WEB—Viewport_Meta标签
二 Viewport meta标签: 语法:<meta name="viewport" content="name=value, name=value" ...
- pywinauto 使用
Pywinauto是基于Python开发的,用于自动化测试的脚本模块,主要操作于Windows标准图形界面.它可以允许你很容易的发送鼠标.键盘动作给Windows的对话框和控件. 其中,最主要功能为 ...
- PHP.42-TP框架商城应用实例-后台17-商品属性3-商品分类的修改与删除
商品分类的修改 1.改表单Goods/edit.html,加下拉框 2.因为商品属性修改涉及商品属性表goods_attr{id,attr_value,attr_id,goods_id}与属性表att ...
- 第6模块 web框架口述题
状态码如200 OK,以3位数字和原因 成.数字中的 一位指定了响应 别,后两位无分 .响应 别有以下5种. 重定向:客户端像服务器端发送请求,服务器告诉客户端你去重定向(状态码302,响应头loca ...
- C++语言入门知识点(详细版)【持续更新每周三更】,小舒舒戳这里!!!
时间过得好快啊,LITTLESUN已经在这块新地图摸打滚爬了一个多月了.前一段时间出了点小意外一直没能更新博客,昨天被小舒舒催更了(惭愧惭愧)便准备着手来一篇回忆录回首一下这一个月走过的风风雨雨,也希 ...
- java Vector向量
9.3.4 Vector向量 [专业IT培训机构,真正零首付入学www.bjsxt.com] Vector底层是用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”. 比如,ind ...
- NOI2018 游记
day-2 飞向长沙 上午收拾了收拾东西,下载了动画<爱吃拉面的小泉同学>的前五集. 吃过午饭,就准备坐车去运城机场.高铁飞速,转眼间就到了.我没坐过几次飞机,而且比较恐飞,就很难受qwq ...
- 使用USB Key(加密狗)实现身份认证
首先你需要去买一个加密狗设备,加密狗是外形酷似U盘的一种硬件设备! 这里我使用的坚石诚信公司的ET99产品 公司项目需要实现一个功能,就是客户使用加密狗登录, 客户不想输入任何密码之类的东西,只需要插 ...
- MinGW安装图文教程以及如何配置C语音编程环境
MinGW安装图文教程以及如何配置C语音编程环境 转载自:http://www.jb51.net/softjc/192017.html MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序 ...