项目中要用到验证码功能,所以实现后在此记录下来实现代码,以备日后用。
首先是action
UserLoginVerificationCodeActionImpl.java
package action.impl;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.servlet.http.HttpSession;
import system.SysAction;
import tool.ImageCode;
import tool.RandomCodeImage;
public class UserLoginVerificationCodeActionImpl extends SysAction implements
UserLoginVerificationCodeAction {
private String code;
private ByteArrayInputStream inputStream;
private static final long serialVersionUID = 123456756789765L;
/**
* @return the code
*/
public String getCode() {
return code;
}
/**
* @return the inputStream
*/
public ByteArrayInputStream getInputStream() {
return inputStream;
}
/**
* @param code
* the code to set
*/
public void setCode(String code) {
this.code = code;
}
/**
* @param inputStream
* the inputStream to set
*/
public void setInputStream(ByteArrayInputStream inputStream) {
this.inputStream = inputStream;
}
/**
* 生成驗證碼
*/
public String verificationCode() {
try {
ImageCode imageCode = RandomCodeImage.getImage();
HttpSession session = request.getSession();
session.setAttribute("userLoginCode", imageCode.getKey());
inputStream = imageCode.getValue();
return SUCCESS;
} catch (IOException e) {
e.printStackTrace();
return ERROR;
}
}
}
工具类ImageCode.java,主要是实现了接口,用于记录验证码和生成的验证码的字节输入流。
package tool;
import java.io.ByteArrayInputStream;
import java.util.Map.Entry;
public class ImageCode implements Entry<String, ByteArrayInputStream> {
private String key;
private ByteArrayInputStream value;
public ImageCode(String key, ByteArrayInputStream byteArrayInputStream) {
this.key = key;
this.value = byteArrayInputStream;
}
public String getKey() {
// TODO Auto-generated method stub
return key;
}
public ByteArrayInputStream getValue() {
// TODO Auto-generated method stub
return value;
}
public ByteArrayInputStream setValue(ByteArrayInputStream value) {
this.value = value;
return value;
}
}
工具类RandomCodeImage.java,主要是生成验证码和验证码输入流。
package tool;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
public class RandomCodeImage {
public static ImageCode getImage() throws IOException {
Random random = new Random();
int width = 60, height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 取得Graphics对象,用来绘制图片
Graphics g = image.getGraphics();
// 绘制图片背景和文字,释放Graphics对象所占用的资源。
g.setColor(Color.WHITE);
// 设置内容生成的位置
g.fillRect(0, 0, width, height);
// 设置内容的字体和大小
g.setFont(new Font("Times New Roman", Font.PLAIN, 14));
// 设置内容的颜色:主要为生成图片背景的线条
g.setColor(Color.WHITE);
// // 图片背景上随机生成155条线条,避免通过图片识别破解验证码
// for (int i = 0; i < 155; i++) {
// int x = random.nextInt(width);
// int y = random.nextInt(height);
// int xl = random.nextInt(12);
// int yl = random.nextInt(12);
// g.drawLine(x, y, x + xl, y + yl);
// }
// 生成四位的随机数,生成一个数,写一个
// String[] s = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
// "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W",
// "X", "Y", "Z" };
String[] s = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" };
String content = "";
for (int i = 0; i < 4; i++) {
String rand = "";
if (random.nextBoolean()) {
rand = String.valueOf(random.nextInt(10));
} else {
int index = random.nextInt(10);
rand = s[index];
}
content += rand;
g.setColor(Color.RED);
g.drawString(rand, 13 * i + 6, 16);
}
// 释放此图形的上下文以及它使用的所有系统资源,类似于关闭流
g.dispose();
ByteArrayOutputStream output = new ByteArrayOutputStream();
ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);
ImageIO.write(image, "JPEG", imageOut);
imageOut.close();
return new ImageCode(content, new ByteArrayInputStream(
output.toByteArray()));
}
private static Color getRandColor(int fc, int bc) {
Random random = new Random();
if (fc > 255)
fc = 255;
if (bc > 255)
bc = 255;
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
}
这个就是action的配置文件了,供前台页面进行访问。
conse.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="userAdmin" namespace="/admin/userAdmin" extends="userAdminNLticket">
<action name="code" class="userLoginVerificationCodeAction"
method="verificationCode">
<result type="stream">
<param name="contentType">image/jpeg</param>
<param name="inputName">inputStream</param>
<param name="bufferSize">1024</param>
</result>
<result name="error" type="json">
<param name="contentType">image/jpeg</param>
<param name="inputName">inputStream</param>
<param name="bufferSize">1024</param>
</result>
</action>
</package>
</struts>
前台页面显示验证码:login.jsp
<div class="code">
<div>
<input type="text" name="code" id="codeId" />
</div>
<div>
<a href="javascript:changeImg();">
<img src="code.nl?code=<%=new Date()%>" id="verificationCodeId" ext:qtip="換一張"> </a>
</div>
</div>
其中的js代码为:
<script type="text/javascript">
function changeImg() {
var img = document.getElementById("verificationCodeId");
img.src = "code.nl?code=" + Math.random();
}
function validateSubmit() {
var errorMsg = document.getElementById("errorMsgId");
var userName = document.getElementById("userNameId");
var password = document.getElementById("passwordId");
var code = document.getElementById("codeId");
if (userName.value == null|| userName.value=="") {
errorMsg.innerHTML = "用戶名不能為空";
return false;
}
if (password.value == null|| password.value=="") {
errorMsg.innerHTML = "密碼不能為空";
return false;
}
if (code.value == null|| code.value=="") {
errorMsg.innerHTML = "驗證碼不能為空";
return false;
}
return true;
}
</script>
在登录验证的action中检验验证码是否正确的方法为:
Object sessionCode = request.getSession().getAttribute("userLoginCode");
if (sessionCode == null
|| !user.getRandom().equalsIgnoreCase(sessionCode.toString())) {
addActionError("驗證碼錯誤");
return;
}
前台输出错误信息的方法为:
<div class="error">
<span id="errorMsgId">${action.actionErrors}</span>
</div>
分享到:
相关推荐
struts2图形验证码实现,两个实现类,和你一个action类
本教程将详细讲解如何利用Struts2框架来实现验证码功能。 首先,我们需要理解验证码的基本原理。验证码通常是一串随机生成的字符或数字,用户需要正确输入才能完成特定操作,如登录、注册等。它的主要目标是验证...
Struts2作为一款流行的Java Web应用框架,支持多种方式来实现验证码功能。本文将详细介绍如何在Struts2项目中生成并显示验证码。 #### 二、核心概念 1. **验证码**:一种用于区分用户是人还是计算机程序的技术手段...
在Struts2框架中,实现验证码功能主要是为了增强网站的安全性,防止自动化脚本或恶意用户进行批量、无意义的注册或登录尝试。以下将详细解释如何在Struts2环境中设置验证码并展示其核心组件: 1. **HTML 页面**: ...
通过以上步骤,我们就能在Struts2应用中实现一个完整的验证码功能。这不仅提高了网站的安全性,也为用户提供了更好的交互体验。在实际开发中,还需要根据项目需求进行相应的定制和优化,确保验证码系统既有效又易于...
通过struts2实现验证码登录,验证码可以点击更换 ,包含用户名密码校验
我们这里采用的是ajax+struts2来做的这个验证。 我们新建一个web工程。然后需要导入struts的相应包。之后我们需要写一个类来生成验证码。 博客地址:http://blog.csdn.net/sdksdk0/article/details/51755489
java动态验证码Struts2集成实现
(参照别人的代码) 部署: 1、将整个源码引入到MyEclipse当中. 2、部署到Tomcat下面,启动服务器,直接 敲...2、当你登录时候,提交的输入框中的验证码和session中存放的验证码比较,如果一样,则通过,不一样,则失败
### Struts2 图片验证码实现解析 #### 一、引言 在Web应用程序中,图片验证码(CAPTCHA)被广泛用于防止自动化攻击和机器人操作,确保用户是真实的人类。Struts2框架提供了丰富的功能来集成这样的安全特性,本文将...
在Struts2框架下实现验证码功能,可以帮助提升用户体验和系统安全性。以下将详细讲解如何在Struts2中创建前端注册验证码。 首先,验证码的实现通常包括两个主要部分:后端生成验证码和前端展示及验证。 1. **后端...
总的来说,Struts2图片验证码的实现涉及了Action的逻辑处理、图像生成、session管理、表单验证等多个方面,体现了Struts2框架在构建复杂业务逻辑时的强大能力。通过熟练掌握这一技术,开发者可以为Web应用提供更为...
完整的Struts2框架,联系oracle数据库实现登录验证 验证码功能:点击图片切换验证码,验证码错误提示 登录成功后变量session中的list集合 内含备注
在Struts2中实现图片验证码功能是常见的需求,主要用于防止恶意自动化程序(如机器人)对网站进行攻击或滥用。下面我们将深入探讨如何在Struts2框架中创建和使用图片验证码。 首先,验证码的基本原理是生成一段随机...
基于Struts2的验证码生成就是将这一功能集成到Struts2框架中的过程。 验证码的主要目的是验证用户是人类而非机器,通常通过显示一个随机生成的图像,要求用户输入图像中显示的字符来实现。在基于Struts2的验证码...
### Struts2 下实现图片验证码的关键技术点 #### 一、引言 在现代Web应用中,验证码(CAPTCHA)是一种常见的用户验证机制,用于区分真实用户与自动化软件(如爬虫)。Struts2框架因其丰富的插件支持及灵活性,在...
总结来说,基于Struts1.x的验证码实现是Web开发中的重要环节,它涉及到服务器端的生成、存储、验证,以及客户端的显示和用户交互。通过合理的验证码设计和实现,可以显著提高Web应用程序的安全性,保护用户的账户不...
要实现Struts2中的中文验证码Action,我们需要以下步骤: 1. **配置Struts2**: 首先,确保你的项目已经集成了Struts2框架,并且在`struts.xml`配置文件中添加了Action的配置。Action的配置应包含一个对应的Action类...
在本文中,我们将深入探讨如何在Struts2框架中实现验证码功能,并结合JavaScript和session技术来增强用户体验。 首先,验证码的核心是生成一个随机的、难以自动识别的图像。这通常涉及到以下几个步骤: 1. **生成...
开发环境: eclipse Kepler JEE IDE + Tomcat v6.0 + Struts-2.3.15(最新版) 步骤: 1. 下载后解压,import to eclipse as a project. 2. 启动 Tomcat v6.0 3. 打开...