验证码总是无法显示!!验证码代码:
 package hu.net.util;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.util.Random;import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;import com.opensymphony.xwork2.ActionSupport; 
public class randomCodeAction extends ActionSupport implements ServletRequestAware,ServletResponseAware {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private HttpServletRequest request;
private HttpServletResponse response;
//设置验证码图片高度
private int height = 60;
//设置验证码图片宽度
private int width = 20;

private char[] Codesequences = {'A','B','C','D','E','F','G','H','I','J','K'};

public String execute() throws Exception{
BufferedImage buffImg = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();

//创建一个随机数生成器类
Random random = new Random();
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);

//创建字体,字体的大小应该根据图片的高度来定
Font font = new Font("宋体",Font.BOLD,20);
//设置字体
g.setFont(font);

//画边框
g.setColor(Color.BLACK);
g.drawRect(0, 0, width = 1, height = 1);

//RandomCode用于保存随机生成的验证码
StringBuffer randomCode = new StringBuffer();
int red =0,green = 0,blue = 0;

//随机产生4位数字验证码
for(int i=0;i<4;i++) {
//得到随机产生的验证码数字
String strRand = String.valueOf(Codesequences[random.nextInt()]);

//产生随机的颜色量来构成颜色值,这样输出的每位验证码的颜色都不同
red = random.nextInt(50);
green = random.nextInt(50);
blue = random.nextInt(50);

//用随机产生的颜色验证码绘制到图像中
g.setColor(new Color(red,green,blue));
g.drawString(strRand, 13 * i + 6, 16);

//将产生的四个随机数组合到一起
randomCode.append(strRand);
}
//将4位数字验证码保存到SESSION中
HttpSession session = request.getSession();
session.setAttribute("randonCode", randomCode.toString());

//禁止图形缓存
response.setHeader("pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);

//图像输出到Servlet输出流中
ServletOutputStream sos = response.getOutputStream();
ImageIO.write(buffImg, "jepg", sos);
sos.close();

return null;
} public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request = request;

} public void setServletResponse(HttpServletResponse response) {
// TODO Auto-generated method stub
this.response = response;
}  
}struts.xml配置:
<action name="randomImg" class="hu.net.util.randomCodeAction">
</action>验证码显示页面代码:
<tr>
<td class="formelem">用户名:</td>
<td class="formelem2"><s:textfield name="userName" /></td>
</tr>
<tr>
<td class="formelem">密码:</td>
<td class="formelem2"><s:password name="password" /></td>
</tr>
<tr>
<td class="formelem">用户类型:</td>
<td class="formelem2">
<s:select name="roleId" list="#{1:'admin',2:'stu'}" headkey="0" headvalue="---请选择---"/>
</td>
</tr>
<tr>
<td class="formelem">验证码:</td>
<td class="formelem2">
<s:textfield name="randomCode"/>
<img src="randomImg.action">
</td>
</tr>struts2验证码图片

解决方案 »

  1.   

    求大神给出答案啊,我最近在自学JavaWEB开发,新手求带。
      

  2.   

    <img id="num" src="<%=path %>/randomImg.action" width="98" height="30" />
    路径换一下试试
      

  3.   

    你单独运行:randomImg.action 看看出来是什么结果。报什么错误?
      

  4.   


    好像提示数组越界错误,非常感谢,请问我要怎么解决它?
    java.lang.ArrayIndexOutOfBoundsException: -99788319
        hu.net.util.randomCodeAction.execute(randomCodeAction.java:61)
        sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      

  5.   

    String strRand = String.valueOf(Codesequences[random.nextInt()]);这段代码有问题。因为你用这个:random.nextInt() 产生的随机数范转比较大,会超出你的数组允许的范围、
    所以你最好把它改为:
    random.nextInt(Codesequences.length)