[原创于: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全称是Jboss Seam,是一个Java EE 5框架。它通过把JSF与EJB3.0组件合并在一起,以及利用JDK5.0的Annotation技术,从而为开发基于Web的企业应用程序提供一个最新的模式。
• 权限验证 - 一个应用十分广泛的权限验证框架,支持用户角色、持久化和基于规则的权限设置,能够灵活地实现属于用户自己的安全设置 • 权限管理 - 一组内置的Seam组件,能让应用程序的安全政策变得容易管理 • ...
eam适应快速开发、简化框架的趋势,Seam给我的感觉像是一个异常简单的MVC框架
seam框架的相关知识总结,比较全面,希望有用
该资源介绍了seam 整合hibernate和jsf
seam_carving代码实现 图像缩放
框架设计和开发毕业论文选题系统,使用JSF技术实现表现层功能,利用EJB3技术实现业务层、数据库链 接访问服务及数据持久化操作。实践证明,JBoss seam.框架在开发应用系统时使用统一组件模式,无分层之忧,无需...
SeamCarving的C++实现代码,使用opencv库。包含完整项目工程及测试图像,可直接使用
Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................
eclipse3.4+tomcat6.0 希望可以帮助大家学习!!
seam下一代web开发框架
seam+richfaces环境框架的配置文件,经过我多次尝试才配置好的环境配置文件,很有用,适合刚接触这些技术的初学者,希望大家支持!
很好的seam教程,较为详尽的参考资料。seam快速开发框架
用Python实现的Seam Carving算法,参考资料https://karthikkaranth.me/blog/implementing-seam-carving-with-python
使用JBoss Studio開發Seam框架專案 (Step by Step 圖式教學)
Seam全称是Jboss Seam,是一个Java EE 5框架。它通过把JSF与EJB3.0组件合并在一起,以及利用JDK5.0的Annotation技术,从而为开发基于Web的企业应用程序提供一个最新的模式。Seam可以让你把EJB组件直接绑定到JSF页面...
seam框架需要的所有jar包,支持seam ui组件
Seam Security 中的验证特性是基于JAAS (Java Authentication and Authorization Service)开发的,它提供了用来进行用户身份认证的高度可配置的接口。然而,针对复杂多变的验证需求,Seam Security 提供了一套非常...
目前关于Seam框架最好的书籍,共421页
Seam 是一种业级 企 Java 的应规用程序框架。它的灵感源自下列原 : 只有一种“工具” Seam为 应 业务业业 义 种统 组 你的 用程序中所有的 定 了一 一的 件模型。 Seam组件可能是 态义 关关 态 有状 的,包含与几...