您的位置:首页 > 运维架构 > 网站架构

j2ee 简单网站搭建:(五)使用 jcaptcha 生成验证码图片

2017-08-24 00:00 706 查看
《j2ee 简单网站搭建:(一) windows 操作系统下使用 eclipse 建立 maven web 项目》
《j2ee 简单网站搭建:(二)添加和配置 spring + spring-mvc 的 mvc 开发环境》
《j2ee 简单网站搭建:(三)在搭建好的 spring maven web 项目中加入 mybatis 访问数据库》
《j2ee 简单网站搭建:(四)将 freemaker 模板引擎作为 spring-mvc 展现层》
《j2ee 简单网站搭建:(五)使用 jcaptcha 生成验证码图片》
《j2ee 简单网站搭建:(六)使用 hibernate validation 实现 domain 层实体类验证》
《j2ee 简单网站搭建:(七)使用 shiro 结合 jcaptcha 实现用户验证登录》
《j2ee 简单网站搭建:(八)使用 jquery-validate 实现页面验证入门》
《j2ee 简单网站搭建:(九)jquery datatables + jquery ui dialog 插件使用入门》
《j2ee 简单网站搭建:(十)jquery ztree 插件使用入门》
《j2ee 简单网站搭建:(十一)ckeditor 控件使用入门》

jcaptcha 是 java 生成图片验证码使用较多的库,是通过 session 在服务端保存生成的验证码以便和用户再次提交的验证码进行比对的,功能设置也很多,本文以完整配置并可正常运行的 spring maven web 项目为基础说明如何完成 jcaptcha 的集成。

一 在 pom.xml 中加入 jcaptcha 包文件

<properties>

<jcaptcha.version>1.0-RC6</jcaptcha.version>

</properties>
<dependencies>

<!-- 验证码生成 Jcaptcha start -->
<dependency>
<groupId>com.octo.captcha</groupId>
<artifactId>jcaptcha-all</artifactId>
<version>${jcaptcha.version}</version>
<exclusions>
<exclusion>
<groupId>quartz</groupId>
<artifactId>quartz</artifactId>
</exclusion>
<exclusion>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
</exclusion>
<exclusion>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
</exclusion>
<exclusion>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
</exclusion>
<exclusion>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</exclusion>
<exclusion>
<groupId>concurrent</groupId>
<artifactId>concurrent</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
</exclusion>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xmlParserAPIs</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 验证码生成 Jcaptcha end -->

</dependencies>

二 创建 spring-jcaptcha-config.xml 配置文件,配置文件中需要关注的参数 wordgen 其中的 constructor-arg 节点中添加可出现的字符。

<?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.xsd">

<!-- Captcha配置开始 -->
<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" />
</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>0123456789abcdefghijklmnopqrstuvwxyz</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>20</value>
</constructor-arg>
<!--最大字体 -->
<constructor-arg index="1">
<value>20</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>20</value>
</constructor-arg>
</bean>
</list>
</constructor-arg>
</bean>
<bean id="backGenUni"
class="com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator">
<!--背景宽度 -->
<constructor-arg index="0">
<value>80</value>
</constructor-arg>
<!--背景高度 -->
<constructor-arg index="1">
<value>32</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="colorDimGrey" />
</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="colorDimGrey" class="java.awt.Color">
<constructor-arg type="int" index="0">
<value>105</value>
</constructor-arg>
<constructor-arg type="int" index="1">
<value>105</value>
</constructor-arg>
<constructor-arg type="int" index="2">
<value>105</value>
</constructor-arg>
</bean>
<!-- Captcha配置结束 -->
</beans>

三 在 web.xml 文件 <context-param> 节点的 <param-value> 参数节点中添加一行 spring-jcaptcha-config.xml 的配置信息,格式为 classpath*:spring-jcaptcha-config.xml

四 在项目默认的 index.jsp 页面中加入用来显示生成验证码图片的控件、输入控件、提交按钮

<%@ page isELIgnored ="false" %>
<html>
<body>
<form id="loginform" name="loginform" role="form" action="captchasubmit" method="post">
<fieldset>
<div>
<img id="captchaimg" name="captchaimg" src="captcha/get" onclick="this.src='captcha/get?d=' + new Date().getTime()"/>
<input id="captcha" name="captcha" type="text" maxlength="4">
</div>
<div class="form-group">
<label id="message" name="message">the result is : [${requestScope.result}]</label>
</div>
<input type="submit" id="loginbutton" name="loginbutton" value="submit" />
</fieldset>
</form>
</body>
</html>

五 在项目 com.binux.webdemo.controller 包中新建 CaptchaController.java 类,在获得页面请求和点击图片控件后重新生成验证图片

package com.binux.webdemo.controller;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.octo.captcha.service.image.ImageCaptchaService;

@Controller
@RequestMapping("captcha")
public class CaptchaController {

@Autowired(required=false)
private ImageCaptchaService imageCaptchaService;

@RequestMapping("/get")
public void getImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
String captchaId = request.getSession().getId();
BufferedImage challenge = imageCaptchaService.getImageChallengeForID(captchaId, request.getLocale());

response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0L);
response.setContentType("image/jpeg");

ImageIO.write(challenge, "jpeg", jpegOutputStream);
byte[] captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

ServletOutputStream stream = response.getOutputStream();
stream.write(captchaChallengeAsJpeg);
stream.flush();
stream.close();
}
}

六 在项目启动的默认处理 controller 类文件 TestController.java 文件中加入 index.jsp 页面的默认处理方法以及按钮提交后的验证码处理方法,启动项目,在浏览器中输入 http://localhost:8080/webdemo/ 应该会在页面的图片控件中出现验证码,输入验证码提交后会根据验证码是否正确做出提示。
controller 层所有响应客户端浏览器请求的方法默认都有 HttpServletRequest request, HttpServletResponse response 两个参数传递过来,如果代码中需要使用则在方法中显示声明后调用。

package com.binux.webdemo.controller;

import com.octo.captcha.service.image.ImageCaptchaService;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("")
public class TestController {
@Autowired
private ImageCaptchaService imageCaptchaService;

@RequestMapping(value="")
public ModelAndView freemakerShow() {
ModelAndView mv = new ModelAndView();
mv.setViewName("index.jsp");
return mv;
}

@RequestMapping(value="/captchasubmit")
public ModelAndView captchaSubmit(HttpServletRequest request, HttpServletResponse response) {
ModelAndView mv = new ModelAndView();
mv.setViewName("index.jsp");

boolean success = imageCaptchaService.validateResponseForID(
((HttpServletRequest) request).getSession().getId(), // 获得验证码的输入值
request.getParameter("captcha")); // captcha 是页面中验证码输入框控件的 id

mv.addObject("result", success ? "right" : "wrong");
return mv;
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JCaptcha
相关文章推荐