[原创于:http://happydev.iteye.com]
在一般的WEB应用注册或登录过程中,都会需要用户输入一个图像生成的登录或注册检验码来加强系统的安全。
本文将就如何在Seam框架下实现这个功能做一个简单说明。
一、思路
在Session中保持一个随机生成的检验码,在登录页面上用图像方式显示这个检验码,然后在登录校验时验证用户输入的校验码是否和Session中保存的一致。
二、实现
登录校验码产生及图像生成类
/**
* 登录校验码生成类
* @author Administrator
*
*/
@Name("verifyCode")
@Scope(value = ScopeType.SESSION)
@AutoCreate
public class VerifyCode {
private String verifyCode;
private String verifyCodeInSession = "";
public void paintVerifyCode(OutputStream out, Object data) throws IOException {
if (data instanceof ImageData) {
ImageData imageData = (ImageData) data;
// 生成一个在1000-9999之间的随机数
Random randomNumber = new Random();
verifyCodeInSession = randomNumber.nextInt(8999) + 1000 + "";
// 把产生的随机数保存到session中
// 生成干扰线的随机数
int outPutLine = 0;
outPutLine = randomNumber.nextInt(100);
BufferedImage img = new BufferedImage(imageData.getWidth(), imageData.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = img.createGraphics();
g.setBackground(imageData.getBackground());
g.setColor(imageData.getDrawColor());
g.setFont(imageData.getTextFont());
// 画矩形
g.clearRect(0, 0, imageData.getWidth(), imageData.getHeight());
// 画干扰线
g.drawLine(outPutLine, outPutLine, imageData.getWidth() - outPutLine, imageData.getHeight() - outPutLine);
// 画产生的随机数
g.drawString(verifyCodeInSession, 10, 16);
g.dispose();
ImageIO.write(img, "jpeg", out);
}
}
public String getVerifyCode() {
return verifyCode;
}
public void setVerifyCode(String verifyCode) {
this.verifyCode = verifyCode;
}
public String getVerifyCodeInSession() {
return verifyCodeInSession;
}
}
相关的ImageData值对象类:(注:mageData.java就一个值对象而已,并不是必要的,就只是定义了这个图片的相关格式,如果在实际应用中不需要变动,完全也可以在绘制图片的代码中写死。)
/**
* 图片数据对象,用于产生校验码图片
* @author Administrator
*
*/
@Name("imageData")
public class ImageData implements java.io.Serializable {
private static final long serialVersionUID = 4745477530606456533L;
private int width = 60;
private int height = 20;
private Color background = new Color(0xDCDCDC);
private Color drawColor = Color.black;
private Font textFont = new Font("Times New Roman", Font.PLAIN, 18);
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public Color getBackground() {
return background;
}
public void setBackground(Color background) {
this.background = background;
}
public Color getDrawColor() {
return drawColor;
}
public void setDrawColor(Color drawColor) {
this.drawColor = drawColor;
}
public Font getTextFont() {
return textFont;
}
public void setTextFont(Font textFont) {
this.textFont = textFont;
}
}
验证代码:
@Name("authenticator")
public class Authenticator
{
@In Identity identity;
@In VerifyCode verifyCode;
@In FacesMessages facesMessages;
public boolean authenticate()
{
if (!verifyCode.getVerifyCode().equals(verifyCode.getVerifyCodeInSession())){
facesMessages.add("验证码不正确");
return false;
}
......
}
}
页面代码:
<tr>
<td>验证码</td>
<td><h:inputText styleClass="logininput" value="#{verifyCode.verifyCode}"/></td>
<td>
<a4j:mediaOutput element="img" cacheable="false" session="false" createContent="#{verifyCode.paintVerifyCode}" value="#{imageData}" mimeType="image/jpeg" border="0"/>
</td>
</tr>
分享到:
相关推荐
### Seam框架核心知识点详解 #### 一、Seam框架简介 Seam,全称为JBoss Seam,是一款基于Java EE 5的技术栈构建的应用框架。它通过整合JSF(JavaServer Faces)与EJB 3.0(Enterprise JavaBeans 3.0)组件,并充分...
Seam的这种全栈式框架特性使得它可以隐藏这些底层实现,减轻了开发者的负担。 另外,Seam对第三方框架的集成深度令人印象深刻。除了基础的邮件服务、工作流支持,Seam还能够轻松整合其他工具和库,如EJB、JMS、WS等...
5. **验证码支持**:为了防御自动化攻击,如脚本或恶意软件,Seam 提供了验证码功能,增强网站的安全性,防止非法登录和其他恶意行为。 对于开发人员来说,Seam 提供了方便的 API 和组件来控制这些功能。例如,可以...
Seam框架是一个全面的Java EE应用开发框架,它旨在简化企业级应用的开发流程,尤其在整合用户界面、业务逻辑和服务层方面。本资源重点讨论了Seam如何与Hibernate ORM框架以及JavaServer Faces (JSF) 用户界面技术...
Seam框架是一个全面的Java企业级开发框架,它在2005年由JBoss公司推出,主要用于简化Java EE应用的复杂性,特别是整合了JSF(JavaServer Faces)、EJB、CDI(Contexts and Dependency Injection)等技术。Seam框架的...
在这个"seam+hibernate注册例子"中,我们将探讨如何在Eclipse 3.4环境下,结合Tomcat 6.0服务器,搭建一个使用Seam和Hibernate的注册系统。 首先,确保你已经安装了Eclipse IDE和Tomcat 6.0服务器。Eclipse 3.4版本...
在实现省市区联动选择时,Seam框架可以有效地管理组件之间的交互和状态,使得代码更加简洁和高效。 1. **XML数据结构解析** 提到的三个XML文件分别代表省份、城市和区县的数据。例如,`Provinces.xml`可能包含了...
7. **最佳实践**:在实现基于数据库的权限验证时,应遵循一些最佳实践,如分离用户数据和权限数据,使用预定义的角色而不是为每个用户分配单独的权限,以及定期审查和更新权限设置以适应业务变化。 综上所述,Seam...
- **重要性分析**:理解Seam的生命周期对于正确地实现组件的行为至关重要,例如在合适的时机执行特定逻辑或清理资源。 - **阶段划分**:主要包括初始化阶段、渲染阶段、事件处理阶段等。 2. **组件与上下文** - ...
它能够在保持图像主要结构不变的情况下,根据需要增加或减少图像的宽度和高度。这种技术在图像处理领域具有广泛应用,如图像缩放、内容自适应布局等。 **基本原理** 1. **能量计算**: Seam Carving 的核心是能量...
1. **启动新项目**: 在JBoss Studio中,选择"File" -> "New" -> "Project",然后在弹出的对话框中,找到" Seam"类别下的"Seam Application Project"模板,点击"Next"。 2. **配置项目属性**: 输入项目名称,选择...
《JBoss Seam:超越Java EE的简易与强大》是一本深度探索JBoss Seam框架的权威著作,由Michael Yuan和Thomas Heute共同撰写。...对于希望深入了解并掌握JBoss Seam框架的开发者来说,这无疑是一本不可或缺的宝典。
Seam是一个Java EE集成框架,它将JavaServer Faces(JSF)、Java Persistence API(JPA)、Enterprise JavaBeans(EJB)3.0以及其他组件统一在一个简化开发的环境中。这篇博客的链接虽然无法直接访问,但我们可以...
4. **EJB集成**:Seam与EJB 3.0无缝集成,允许开发者在不牺牲可维护性和性能的前提下,利用EJB来实现业务逻辑。这使得Seam成为开发企业级应用的理想选择。 5. **持久性管理**:Seam通过JPA提供了简单且强大的数据...
"seamcarving"是一种图像处理技术,主要用于图像尺寸调整,它可以在保持图像主要结构不变的情况下,增加或减少图像的宽度和高度。在MATLAB中实现seamcarving,可以为图像编辑和适应不同显示设备提供便利。本文将深入...
- **理解代码**:这部分深入解析了注册示例中的代码实现细节,帮助读者理解Seam框架是如何实现用户注册功能的。 - **工作原理**:进一步解释了注册流程背后的逻辑和技术要点,为读者提供了更深层次的理解。 ##### 3...
在Seam框架中,每个组件都与特定的执行环境或“语境”相关联。这意味着组件可以根据当前的业务流程、用户会话或特定的上下文条件来提供服务。这种设计模式提高了代码的可重用性和灵活性,同时降低了组件之间的耦合度...
Seam Carving是一种图像内容感知的尺寸调整方法,它能够在保持图像主要结构不变的情况下,智能地减少或增加图像的宽度和高度。这种方法是由Amit Agarwal和Matthieu Salzmann于2007年提出的,其核心思想是通过找到...
6. **国际化与本地化**:学习如何在Seam项目中实现多语言支持。 7. **测试与调试**:掌握Seam的测试工具和策略,确保代码质量。 8. **Seam组件**:了解如Conversation、Transactions、邮件服务等Seam内置组件的使用...