基于SSH2框架的登录验证码的实现.docx

上传人:b****3 文档编号:3845206 上传时间:2022-11-25 格式:DOCX 页数:15 大小:106.15KB
下载 相关 举报
基于SSH2框架的登录验证码的实现.docx_第1页
第1页 / 共15页
基于SSH2框架的登录验证码的实现.docx_第2页
第2页 / 共15页
基于SSH2框架的登录验证码的实现.docx_第3页
第3页 / 共15页
基于SSH2框架的登录验证码的实现.docx_第4页
第4页 / 共15页
基于SSH2框架的登录验证码的实现.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

基于SSH2框架的登录验证码的实现.docx

《基于SSH2框架的登录验证码的实现.docx》由会员分享,可在线阅读,更多相关《基于SSH2框架的登录验证码的实现.docx(15页珍藏版)》请在冰豆网上搜索。

基于SSH2框架的登录验证码的实现.docx

基于SSH2框架的登录验证码的实现

可以显示三种不同类型的验证码,显示效果如下图所示:

第一种:

简单验证码,4位随机数字:

 

 

第二种:

英文字符加数字的验证码:

 

 

第三种:

像铁路订票系统一样的验证码,肆+?

=21 

 

 

实现的验证码类

Java代码 

package com.base.util;  

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.util.Random;  

import javax.imageio.ImageIO;  

import javax.imageio.stream.ImageOutputStream;  

/** 

验证码类,主要生成几种不同类型的验证码  

第一种:

简单验证码,4位随机数字  

第二种:

英文字符加数字的验证码  

第三种:

像铁路订票系统一样的验证码,肆+?

=21 

*  

@author 李朋飞 

*  

*/  

public class VerificationCodeUtil {  

private ByteArrayInputStream image;// 图像  

private String str;// 验证码  

private static final int WIDTH = 80;  

private static final int HEIGHT = 20;  

public static void main(String[] arg) {  

VerificationCodeUtil vcu = VerificationCodeUtil.Instance();  

System.err.println(vcu.getVerificationCodeValue());  

}  

/** 

功能:

获取一个验证码类的实例 

*  

@return 

*/  

public static VerificationCodeUtil Instance() {  

return new VerificationCodeUtil();  

}  

private VerificationCodeUtil() {  

BufferedImage image = new BufferedImage(WIDTH, HEIGHT,  

BufferedImage.TYPE_INT_RGB);  

int randomNum = new Random().nextInt(3);  

if (randomNum == 0) {  

initNumVerificationCode(image);  

} else if (randomNum == 1) {  

initLetterAndNumVerificationCode(image);  

} else {  

initChinesePlusNumVerificationCode(image);  

}  

}  

/** 

功能:

设置第一种验证码的属性 

*/  

public void initNumVerificationCode(BufferedImage image) {  

Random random = new Random(); // 生成随机类  

Graphics g = initImage(image, random);  

String sRand = "";  

for (int i = 0; i < 4; i++) {  

String rand = String.valueOf(random.nextInt(10));  

sRand += rand;  

// 将认证码显示到图象中  

g.setColor(new Color(20 + random.nextInt(110), 20 + random  

.nextInt(110), 20 + random.nextInt(110)));  

// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成  

g.drawString(rand, 13 * i + 6, 16);  

}  

this.setStr(sRand);/* 赋值验证码 */  

// 图象生效  

g.dispose();  

this.setImage(drawImage(image));  

}  

/** 

功能:

设置第二种验证码属性 

*/  

public void initLetterAndNumVerificationCode(BufferedImage image) {  

Random random = new Random(); // 生成随机类  

Graphics g = initImage(image, random);  

String[] letter = { "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 sRand = "";  

for (int i = 0; i < 4; i++) {  

String tempRand = "";  

if (random.nextBoolean()) {  

tempRand = String.valueOf(random.nextInt(10));  

} else {  

tempRand = letter[random.nextInt(25)];  

if (random.nextBoolean()) {// 随机将该字母变成小写  

tempRand = tempRand.toLowerCase();  

}  

}  

sRand += tempRand;  

g.setColor(new Color(20 + random.nextInt(10), 20 + random  

.nextInt(110), 20 + random.nextInt(110)));  

g.drawString(tempRand, 13 * i + 6, 16);  

}  

this.setStr(sRand);/* 赋值验证码 */  

g.dispose(); // 图象生效  

this.setImage(drawImage(image));  

}  

/** 

功能:

设置第三种验证码属性 即:

肆+?

=24 

*/  

public void initChinesePlusNumVerificationCode(BufferedImage image) {  

String[] cn = { "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "拾" };  

Random random = new Random(); // 生成随机类  

Graphics g = initImage(image, random);  

int x = random.nextInt(10) + 1;  

int y = random.nextInt(30);  

this.setStr(String.valueOf(y));  

g.setFont(new Font("楷体", Font.PLAIN, 14));// 设定字体  

g.setColor(new Color(20 + random.nextInt(10), 20 + random.nextInt(110),  

20 + random.nextInt(110)));  

g.drawString(cn[x - 1], 1 * 1 + 6, 16);  

g.drawString("+", 22, 16);  

g.drawString("?

", 35, 16);  

g.drawString("=", 48, 16);  

g.drawString(String.valueOf(x + y), 61, 16);  

g.dispose(); // 图象生效  

this.setImage(drawImage(image));  

}  

public Graphics initImage(BufferedImage image, Random random) {  

Graphics g = image.getGraphics(); // 获取图形上下文  

g.setColor(getRandColor(200, 250));// 设定背景色  

g.fillRect(0, 0, WIDTH, HEIGHT);  

g.setFont(new Font("Times New Roman", Font.PLAIN, 14));// 设定字体  

g.setColor(getRandColor(160, 200)); // 随机产生165条干扰线,使图象中的认证码不易被其它程序探测到  

for (int i = 0; i < 165; 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);  

}  

return g;  

}  

public ByteArrayInputStream drawImage(BufferedImage image) {  

ByteArrayInputStream input = null;  

ByteArrayOutputStream output = new ByteArrayOutputStream();  

try {  

ImageOutputStream imageOut = ImageIO  

.createImageOutputStream(output);  

ImageIO.write(image, "JPEG", imageOut);  

imageOut.close();  

input = new ByteArrayInputStream(output.toByteArray());  

} catch (Exception e) {  

System.out.println("验证码图片产生出现错误:

" + e.toString());  

}  

return input;  

}  

/* 

功能:

给定范围获得随机颜色 

*/  

private 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);  

}  

/** 

功能:

获取验证码的字符串值 

*  

@return 

*/  

public String getVerificationCodeValue() {  

return this.getStr();  

}  

/** 

功能:

取得验证码图片 

*  

@return 

*/  

public ByteArrayInputStream getImage() {  

return this.image;  

}  

public String getStr() {  

return str;  

}  

public void setStr(String str) {  

this.str = str;  

}  

public void setImage(ByteArrayInputStream image) {  

this.image = image;  

}  

}  

struts2中获得验证码:

Java代码 

/** 

功能:

打开login.jsp的时候获得随机的验证码图片 

*  

@return 

*/  

public String getRandomPictrue() {  

VerificationCodeUtil vcu = VerificationCodeUtil.Instance();  

this.setInputStream(vcu.getImage());  

ActionContext.getContext().getSession().put("random", vcu.getVerificationCodeValue());// 取得随机字符串放入HttpSession  

return SUCCESS;  

}  

前台jsp页面 

       

    function changeValidateCode(obj) {     

           //获取当前的时间作为参数,无具体意义     

        var timenow = new Date().getTime();     

           //每次请求需要一个不同的参数,否则可能会返回同样的验证码     

        //这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。

     

        obj.src="getRandomPictrue?

d="+timenow;     

    }     

  

  

                验证码

  

                   

                

50px; height:

17px; background-color:

#87adbf; border:

solid 1px #153966; font-size:

12px; color:

#283439; ">  

                

  

                 

 

在登录的时候,后台验证验证码是否输入正确

public String userLogin() {  

        String yanzhengma = this.getYzm().toLowerCase();//将验证码字符串全部转换成小写  

        String random = getSessionAttribute("random").toString().toLowerCase();        

        if(!

yanzhengma.equals(random)){  

            this.setRequestAttribute("errorMessage", "验证码错误,请核实后重新输入");  

            return INPUT;  

        }  

        else{  

            UserModel user = getUserService().loginJudge(getUserName(),  

                    getUserPass());  

            if (user !

= null) {  

                getSession().setAttribute("user", user);  

                getSession().setAttribute("userId", user.getUserId());  

                List treeList = userService.getTree(user  

                        .getUserId());  

                getRequest().setAttribute("treeList", treeList);  

                this.setRequestAttribute("username", user.getUserName());  

                user.setLastLoginTime(DateUtil.getCurrentTimestamp());  

                if (userService.addUser(user)) {  

                    logger.info(getUserName() + "登录成功");  

                    return SUCCESS;  

                } else {  

                    logger.info(getUserName() + "登录失败,失败原因,更新lastLoginTime失败");  

                    this.setRequestAttribute("errorMessage", "服务器hold不住啦,请稍后重新登录");  

                    return INPUT;  

                }  

            } else {  

                logger.info(getUserName() + "登录失败,用户名或者密码不正确");  

                this.setRequestAttribute("errorMessage", "登录失败,用户名或者密码不正确");  

                return INPUT;  

            }  

        }  

          

    }  

packagecom.base.util;

importjava.awt.Color;

importjava.awt.Font;

importjava.awt.Graphics;

importjava.awt.image.BufferedImage;

importjava.io.ByteArrayInputStream;

importjava.io.ByteArrayOutputStream;

importjava.util.Random;

importjavax.imageio.ImageIO;

importjavax.imageio.stream.ImageOutputStream;

/**

 *验证码类,主要生成几种不同类型的验证码 

 *第一种:

简单验证码,4位随机数字 

 *第二种:

英文字符加数字的验证码 

 *第三种:

像铁路订票系统一样的验证码,肆+?

=21

 * 

 *@author李朋飞

 * 

 */

publicclassVerificationCodeUtil{

   privateByteArrayInputStreamimage;//图像

   privateStringstr;//验证码

   privatestaticfinalintWIDTH=80;

   privatestaticfinalintHEIGHT=20;

   publicstaticvoidmain(String[]arg){

      VerificationCodeUtilvcu=VerificationCodeUtil.Instance();

      System.err.println(vcu.getVerificationCodeValue());

   }

   /**

   *功能:

获取一个验证码类的实例

   * 

   *@return

   */

   publicstaticVerificationCodeUtilInstance(){

      returnnewVerificationCodeUtil();

   }

   privateVerificationCodeUtil(){

      BufferedImageimage=newBufferedImage(WIDTH,HEIGHT,

            BufferedImage.TYPE_INT_RGB);

      intrandomNum=newRandom().nextInt(3);

      if(randomNum==0){

         initNumVerificationCode(image);

      }elseif(randomNum==1){

         initLetterAndNumVerificationCode(image);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1