struts2实现验证码的生成

本文详细介绍了如何在 Struts2 框架中实现验证码的生成,包括利用 JavaScript 进行前端交互,后台使用 Java 生成随机验证码,并将其输出到 input 输入框,确保网页验证的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1、定义一个生成验证码的工具类
package org.qrsx.yang_xuexi.action;
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;
public class RandomNumUtil {

private ByteArrayInputStream image;//图像      
   private String str;//验证码      
       
   private RandomNumUtil(){      
   init();//初始化属性      
   }      
   /*    
   * 取得RandomNumUtil实例    
   */      
   public static RandomNumUtil Instance(){      
   return new RandomNumUtil();      
   }      
   /*    
   * 取得验证码图片    
   */      
   public ByteArrayInputStream getImage(){      
   return this.image;      
   }      
   /*    
   * 取得图片的验证码    
   */      
   public String getString(){      
   return this.str;      
   }      
   private void init() {      
   // 在内存中创建图象      
   int width=85, height=20;      
   BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);      
   // 获取图形上下文      
   Graphics g = image.getGraphics();      
   // 生成随机类      
   Random random = new Random();      
   // 设定背景色      
   g.setColor(getRandColor(200,250));      
   g.fillRect(0, 0, width, height);      
   // 设定字体      
   g.setFont(new Font("Times New Roman",Font.PLAIN,18));      
   // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到      
   g.setColor(getRandColor(160,200));      
   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);      
   }      
   // 取随机产生的认证码(6位数字)      
   String sRand="";      
   for (int i=0;i<6;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.str=sRand;      
       
   //图象生效      
   g.dispose();      
   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());      
   }      
       
   this.image=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);      
   }     
}
2、定义一个输出验证码的action
package util;
import java.io.ByteArrayInputStream;
import org.qrsx.yang_xuexi.action.RandomNumUtil;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class UtilAction extends ActionSupport {

private static final long serialVersionUID = -7193209177116825032L;
private ByteArrayInputStream inputStream;
public String validNumGenerate() throws Exception {
RandomNumUtil rdnu = RandomNumUtil.Instance();
this.setInputStream(rdnu.getImage());// 取得带有随机字符串的图片
ActionContext.getContext().getSession().put("random", rdnu.getString());// 取得随机字符串放入HttpSession
return SUCCESS;
}
public void setInputStream(ByteArrayInputStream inputStream) {
this.inputStream = inputStream;
}

public ByteArrayInputStream getInputStream() {
return inputStream;
}

}
3、配置struts.xml
 <action name="randNum" class="util.UtilAction" method="validNumGenerate">        
           <result name="success" type="stream">        
                <param name="contentType">image/jpeg</param>        
                <param name="inputName">inputStream</param>        
           </result>     
   </action>
4、jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<script type="text/javascript" src="jquery-1.5.1.js"></script>
<script type="text/javascript">
  function refresh()
  {
 $("#auimg").attr("src","randNum.action?now="+new Date());
  }
</script>
<body>
 <form action="login.action">
    username:<input type="text"  name="username"/><br/>
    password:<input type="password" name="password" /><br/>
    验证码:<input type="text" name="checkCode" id="checkCode" size="15" maxlength="20" class="input_val">
   <img src="randNum.action" name="auimg" id="auimg"><a href="javascript:;" onClick="refresh();">看不清?</a><br>
    <input  type="submit"/>
    </form>
</body>
</html>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值