`
段海波
  • 浏览: 318392 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Struts2下验证码的实现

阅读更多

项目中要用到验证码功能,所以实现后在此记录下来实现代码,以备日后用。

首先是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验证码实现

    struts2图形验证码实现,两个实现类,和你一个action类

    struts2实现验证码

    本教程将详细讲解如何利用Struts2框架来实现验证码功能。 首先,我们需要理解验证码的基本原理。验证码通常是一串随机生成的字符或数字,用户需要正确输入才能完成特定操作,如登录、注册等。它的主要目标是验证...

    struts2 生成验证码

    Struts2作为一款流行的Java Web应用框架,支持多种方式来实现验证码功能。本文将详细介绍如何在Struts2项目中生成并显示验证码。 #### 二、核心概念 1. **验证码**:一种用于区分用户是人还是计算机程序的技术手段...

    struts中实现验证码

    在Struts2框架中,实现验证码功能主要是为了增强网站的安全性,防止自动化脚本或恶意用户进行批量、无意义的注册或登录尝试。以下将详细解释如何在Struts2环境中设置验证码并展示其核心组件: 1. **HTML 页面**: ...

    Struts2的验证码生成

    通过以上步骤,我们就能在Struts2应用中实现一个完整的验证码功能。这不仅提高了网站的安全性,也为用户提供了更好的交互体验。在实际开发中,还需要根据项目需求进行相应的定制和优化,确保验证码系统既有效又易于...

    struts2实现验证码登陆

    通过struts2实现验证码登录,验证码可以点击更换 ,包含用户名密码校验

    Ajax+Struts2实现验证码验证功能

    我们这里采用的是ajax+struts2来做的这个验证。 我们新建一个web工程。然后需要导入struts的相应包。之后我们需要写一个类来生成验证码。 博客地址:http://blog.csdn.net/sdksdk0/article/details/51755489

    java动态验证码Struts2集成实现

    java动态验证码Struts2集成实现

    struts2验证码完整实例

    (参照别人的代码) 部署: 1、将整个源码引入到MyEclipse当中. 2、部署到Tomcat下面,启动服务器,直接 敲...2、当你登录时候,提交的输入框中的验证码和session中存放的验证码比较,如果一样,则通过,不一样,则失败

    struts2图片验证码--struts2图片验证码-(通用版)

    ### Struts2 图片验证码实现解析 #### 一、引言 在Web应用程序中,图片验证码(CAPTCHA)被广泛用于防止自动化攻击和机器人操作,确保用户是真实的人类。Struts2框架提供了丰富的功能来集成这样的安全特性,本文将...

    Struts2验证码

    在Struts2框架下实现验证码功能,可以帮助提升用户体验和系统安全性。以下将详细讲解如何在Struts2中创建前端注册验证码。 首先,验证码的实现通常包括两个主要部分:后端生成验证码和前端展示及验证。 1. **后端...

    Struts2 图片验证码

    总的来说,Struts2图片验证码的实现涉及了Action的逻辑处理、图像生成、session管理、表单验证等多个方面,体现了Struts2框架在构建复杂业务逻辑时的强大能力。通过熟练掌握这一技术,开发者可以为Web应用提供更为...

    Struts2-登录验证码

    完整的Struts2框架,联系oracle数据库实现登录验证 验证码功能:点击图片切换验证码,验证码错误提示 登录成功后变量session中的list集合 内含备注

    struts2 图片 验证码

    在Struts2中实现图片验证码功能是常见的需求,主要用于防止恶意自动化程序(如机器人)对网站进行攻击或滥用。下面我们将深入探讨如何在Struts2框架中创建和使用图片验证码。 首先,验证码的基本原理是生成一段随机...

    基于struts2的验证码生成

    基于Struts2的验证码生成就是将这一功能集成到Struts2框架中的过程。 验证码的主要目的是验证用户是人类而非机器,通常通过显示一个随机生成的图像,要求用户输入图像中显示的字符来实现。在基于Struts2的验证码...

    struts2下实现了图片验证码

    ### Struts2 下实现图片验证码的关键技术点 #### 一、引言 在现代Web应用中,验证码(CAPTCHA)是一种常见的用户验证机制,用于区分真实用户与自动化软件(如爬虫)。Struts2框架因其丰富的插件支持及灵活性,在...

    基于struts1.x的验证码实现

    总结来说,基于Struts1.x的验证码实现是Web开发中的重要环节,它涉及到服务器端的生成、存储、验证,以及客户端的显示和用户交互。通过合理的验证码设计和实现,可以显著提高Web应用程序的安全性,保护用户的账户不...

    struts2生成中文验证码的Action

    要实现Struts2中的中文验证码Action,我们需要以下步骤: 1. **配置Struts2**: 首先,确保你的项目已经集成了Struts2框架,并且在`struts.xml`配置文件中添加了Action的配置。Action的配置应包含一个对应的Action类...

    Struts2验证码用户登录

    在本文中,我们将深入探讨如何在Struts2框架中实现验证码功能,并结合JavaScript和session技术来增强用户体验。 首先,验证码的核心是生成一个随机的、难以自动识别的图像。这通常涉及到以下几个步骤: 1. **生成...

    漂亮登陆界面+Struts2 验证码 完整实现

    开发环境: eclipse Kepler JEE IDE + Tomcat v6.0 + Struts-2.3.15(最新版) 步骤: 1. 下载后解压,import to eclipse as a project. 2. 启动 Tomcat v6.0 3. 打开...

Global site tag (gtag.js) - Google Analytics