关于验证码的独立模块的整合说明
验证码我们采用开源的jcaptcha(http://www.jcaptcha.net/)来实现,主要考虑到两点
1. 已经有相当成熟的成功案例。
2. 配置非常简单,整合Spring框架非常容易。
现在将配置文件和应用开发简单的说明一下
需要的包中包括
jcaptcha-all-1.0-RC6.jar
spring-2.x.x.jar
maven 配置文件只需要添加
<dependency>
<groupId>com.octo.captcha</groupId>
<artifactId>jcaptcha</artifactId>
<version>1.0-RC6</version>
</dependency>
配置文件
applicationContext-jcaptcha.xml
web.xml
ImageCaptchaServlet.java (本来只做参考也可以使用)
web.xml文件内容
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext*.xml
</param-value>
</context-param>
<filter>
<filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<servlet>
<servlet-name>validateImage</servlet-name>
<servlet-class>com.zongheng.servlet.ImageJCaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>validateImage</servlet-name>
<url-pattern>/validateImage</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
类ImageJCaptchaServlet.java
package com.zongheng.servlet;
import com.octo.captcha.service.image.ImageCaptchaService;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ImageJCaptchaServlet extends HttpServlet {
private static final long serialVersionUID = -5382766069139170499L;
protected final Logger logger = LoggerFactory.getLogger(getClass());
protected ImageCaptchaService captchaService;
public void init() throws ServletException {
super.init();
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
captchaService = (ImageCaptchaService) context.getBean("captchaService");
}
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String jsessionid = request.getSession(true).getId();
BufferedImage image = captchaService.getImageChallengeForID(jsessionid,request.getLocale());
OutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
// render the captcha challenge as a JPEG image in the response
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);
encoder.encode(image);
outputStream.flush();
outputStream.close();
} catch (IOException ex) {
logger.error("gen image error", ex);
response.sendError(HttpServletResponse.SC_NOT_FOUND);
} finally {
if (outputStream != null) {
outputStream.close();
}
}
应用程序校验验证码是否正确 非常简单
String jsessionid = request.getSession(true).getId(); //得到当前用户的SessionID
String code =request.getParameter(“code”); //获取用户输入的验证码
ApplicationContext context = … 通过注入的方式 或 通过Servlet方法得到
ImageCaptchaService captchaService = (ImageCaptchaService) context.getBean("captchaService");
Boolean flag = captchaService.validateResponseForID(sessionid,code);
If(flag){
//验证通过
}else{
//验证未通过
}
applicationContext-jcaptch.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-2.5.xsd">
<bean id="captchaService" class="com.octo.captcha.service.image.DefaultManageableImageCaptchaService">
<property name="captchaEngine" ref="imageEngine"/>
</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="wordgen"/>
<constructor-arg ref="wordtoimage"/>
</bean>
<bean id="wordgen" class="com.octo.captcha.component.word.wordgenerator.RandomWordGenerator">
<constructor-arg value="23456789ABCDEFGHJKLMNPQRSTXYZ"/>
<!—建议不要使用1 因为如果通过技术手段展现图片中很难分辨1 和 I -->
</bean>
<bean id="wordtoimage" class="com.octo.captcha.component.image.wordtoimage.ComposedWordToImage">
<constructor-arg index="0" ref="fontGenRandom"/>
<constructor-arg index="1" ref="backGenUni"/>
<constructor-arg index="2" ref="simpleWhitePaster"/>
</bean>
<bean id="fontGenRandom" class="com.octo.captcha.component.image.fontgenerator.RandomFontGenerator">
<constructor-arg index="0" value="30"/>
<!—字体宽度 根据实际情况做调整-->
<constructor-arg index="1" value="40"/>
<!—字体高度 根据实际情况做调整-->
<constructor-arg index="2">
<list>
<ref bean="fontArial"/>
<ref bean="fontTahoma"/>
<ref bean="fontVerdana"/>
<ref bean="fontComic"/>
<ref bean="fontLucida"/>
</list>
</constructor-arg>
</bean>
<!--fond config -->
<bean id="fontArial" class="java.awt.Font">
<constructor-arg index="0" value="Arial"/>
<constructor-arg index="1" value="0"/>
<constructor-arg index="2" value="10"/>
</bean>
<bean id="fontTahoma" class="java.awt.Font">
<constructor-arg index="0" value="Tahoma"/>
<constructor-arg index="1" value="0"/>
<constructor-arg index="2" value="10"/>
</bean>
<bean id="fontVerdana" class="java.awt.Font">
<constructor-arg index="0" value="Verdana"/>
<constructor-arg index="1" value="0"/>
<constructor-arg index="2" value="10"/>
</bean>
<bean id="fontComic" class="java.awt.Font">
<constructor-arg index="0" value="Comic sans MS"/>
<constructor-arg index="1" value="0"/>
<constructor-arg index="2" value="10"/>
</bean>
<bean id="fontLucida" class="java.awt.Font">
<constructor-arg index="0" value="Lucida console"/>
<constructor-arg index="1" value="0"/>
<constructor-arg index="2" value="10"/>
</bean>
<!--fond end-->
<bean id="backGenUni" class="com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator">
<constructor-arg index="0" value="200"/>
<!—图片宽度 单位为pixel根据实际情况做调整-->
<constructor-arg index="1" value="100"/>
<!—图片高度 单位为pixel根据实际情况做调整-->
</bean>
<bean id="simpleWhitePaster" class="com.octo.captcha.component.image.textpaster.SimpleTextPaster">
<constructor-arg type="java.lang.Integer" index="0" value="3"/>
<!—最小的字符长度 根据实际情况做调整-->
<constructor-arg type="java.lang.Integer" index="1" value="5"/>
<!—最大的字符长度 根据实际情况做调整-->
<constructor-arg type="java.awt.Color" index="2" ref="colorGreen"/>
</bean>
<bean id="colorGreen" class="java.awt.Color">
<!—字体颜色 根据实际情况做调整-->
<constructor-arg index="0" value="10"/>
<constructor-arg index="1" value="100"/>
<constructor-arg index="2" value="200"/>
</bean>
</beans>
JSP页面程序
<script language="javascript" type="text/javascript">
function changeImage() {
document.getElementById('japtchaImage').src = '/validateImage?' + Math.random();
}
</script>
<img src="/ validateImage " width="200" id="japtchaImage" name="code" _disibledevent="changeImage();">
<a href="#" _disibledevent="changeImage();return false;" title="看不清,换一张" >看不清,换一张</a>
<!---使用Math.random()是为了确保调用Servlet,否则Servlet会缓存用户的请求-->
分享到:
相关推荐
【VB识别BAIDU验证码的源代码】是一个关于使用Visual Basic(VB)编程语言实现百度验证码识别技术的项目。在互联网应用中,验证码通常用于防止自动化程序(如机器人)进行恶意操作,例如批量注册或频繁投票。百度...
综上所述,"发送邮箱或者手机验证码按钮组件"是组件化开发的一个实例,它整合了用户界面设计、后端通信、异步处理、错误管理等多个技术领域,体现了现代Web开发中模块化和可重用性的核心原则。通过熟练掌握这些知识...
Spring Boot通过内嵌Tomcat或Jetty服务器,自动配置Spring框架及其他依赖,使得开发者可以快速创建独立运行的应用。 2. **Spring Security**:是Spring生态中的安全模块,用于处理身份验证和授权。在这个项目中,...
在本项目“机器学习识别图片验证码(专门应付本科毕业设计).zip”中,我们可以深入探讨如何使用机器学习技术来解决图像验证码识别的问题。验证码(CAPTCHA)是一种防止自动化程序进行恶意操作的安全机制,通常包括...
1)新架构引入节点概念进行模块高级组合部署,以前的模块即可以独立部署,也可以一个节点下部署多个模块混合使用,实现一个节点频道需要多种内容模型组成的特殊应用; 2)重新设计研发会员中心,新的会员中心比以往...
- **单元测试**:通过独立测试每个组件来确保其功能正确,IOC(Inversion of Control)测试单元专门针对Spring的依赖注入进行验证。 整合这些框架时,开发者通常会创建一个配置文件来管理Bean,定义Action和...
- **资源整合**:BBS不仅是一个信息交流平台,也是各种网络资源的集合地,如软件下载、资料分享等。 - **社会影响力**:许多知名BBS如天涯论坛、中华网社区等具有较大的社会影响力,它们能够影响舆论走向,促进社会...
17、多城市版本:支持多城市间自由切换,不同城市可采用独立二级域名,系统根据浏览者IP自动跳转所在城市,分站有独立的广告管理,每个分站可设置独立管理员,分站拥有独立的SEO优化设置可设置不同的关键词描述。...
(16)多城市版本:支持多城市间自由切换,不同城市可采用独立二级域名,系统根据浏览者IP自动跳转所在城市,分站有独立的广告管理,每个分站可设置独立管理员,分站拥有独立的SEO优化设置可设置不同的关键词描述 ...
(16)多城市版本:支持多城市间自由切换,不同城市可采用独立二级域名,系统根据浏览者IP自动跳转所在城市,分站有独立的广告管理,每个分站可设置独立管理员,分站拥有独立的SEO优化设置可设置不同的关键词描述 ...
模板体系: 从方案模板、会员中心、系统模块模板、栏目、列表页面、内容页完全可独立选择。 积分体系: 积分兑换、积分消费、积分规则等已经开始在系统内实施。 菜单体系: 后台菜单、前台菜单、会员中心菜单均可...
创建网页 用户可以根据需要自己设置一下相关的个性独立页面,丰富网站的介绍说明及功能。 悬浮JS留言板 会员可以在后台复制代码,任意位置任意网站均可用。 地图模块 和第三方地图合作,可以自动识别用户的地址,...
创建网页 用户可以根据需要自己设置一下相关的个性独立页面,丰富网站的介绍说明及功能。 悬浮JS留言板 会员可以在后台复制代码,任意位置任意网站均可用。 地图模块 和第三方地图合作,可以自动识别用户的地址,...
创建网页 用户可以根据需要自己设置一下相关的个性独立页面,丰富网站的介绍说明及功能。 悬浮JS留言板 会员可以在后台复制代码,任意位置任意网站均可用。 地图模块 和第三方地图合作,可以自动识别用户的地址,...
│ 25-独立开发的功能说明-1.mp4 │ 26-补充-关于hibernate中一对一唯一主键关联的补充-1.mp4 │ 27-vue的路由-1.mp4 │ 28-shiro介绍和quickstart样例项目-1.mp4 │ 29-quickstart项目的创建和日志系统的分析-1.mp4...
创建网页 用户可以根据需要自己设置一下相关的个性独立页面,丰富网站的介绍说明及功能。 悬浮JS留言板 会员可以在后台复制代码,任意位置任意网站均可用。 地图模块 和第三方地图合作,可以自动识别用户的地址,...
用户可以根据需要自己设置一下相关的个性独立页面,灵活创建例如关于我们、联系方式等页面 地图模块 和第三方地图合作,可以自动识别用户的地址,在地图上标出来 在线反馈 访客留言给网站,便于及时反馈问题和...
创建网页 用户可以根据需要自己设置一下相关的个性独立页面,丰富网站的介绍说明及功能。 悬浮JS留言板 会员可以在后台复制代码,任意位置任意网站均可用。 地图模块 和第三方地图合作,可以自动识别用户的地址...
创建网页 用户可以根据需要自己设置一下相关的个性独立页面,丰富网站的介绍说明及 功能。 悬浮JS留言板 会员可以在后台复制代码,任意位置任意网站均可用。 地图模块 和第三方地图合作,可以自动识别用户的地址...
系统的五大模块构成了一个完整的管理框架,各模块之间既相互独立又紧密联系,共同支撑着煤矿设备资源管理的高效运行。 在用户管理模块中,通过引入验证码、用户名和密码等多层验证机制,极大增强了系统安全性,有效...