以下是我的代码,但是不知道为啥,出来的验证码背景颜色永远都是黑色,不知道和我用的是EE5标准有关系么?      
private int w = 70;//验证码宽度
private int h = 35;//验证码高度
private Random r = new Random();//定义一个随机数对象
private String[] fontNames = {"宋体","黑体","微软雅黑","楷体"};//定义一个字符串数组存放字体种类
private String codes = "23456789qwertyuipasdfghjkzxcvbnmQWERTYUIPASDFGHJKZXCVBNM";//定义一个字符串存放验证码字符的取值范围
private Color bgColor = new Color(255, 255, 255);//定义一个白色背景
private String text;//定义一个字符串变量用来存放验证码的字符

//定义一个随机生成颜色的方法
private Color randomColor(){
int red = r.nextInt(150);
int green = r.nextInt(150);
int blue = r.nextInt(150);
return new Color(red, green, blue);
}

//定义一个随机生成字体的方法
private Font randomFont(){
int index = r.nextInt(fontNames.length);//从取值是字体字符串长度的范围中随机生成一个字符串下标
String fontName = fontNames[index];//通过得到的下标得到一个字体
int style = r.nextInt(4);//0-3是4种字体的样式,无样式、粗体、斜体、粗+斜
int size = r.nextInt(5)+24;//让字的大小在24-28之间
return new Font(fontName, style, size);//通过三个随机生成的参数创建一个字对象
}

//干扰线生成方法
private void drawLine(BufferedImage image){
int num = 3;//干扰线一共三条
Graphics2D g2 = (Graphics2D) image.getGraphics();//得到绘画环境,即画笔
for (int i = 0; i < num; i++) {
int x1 = r.nextInt(w);
int y1 = r.nextInt(h);
int x2 = r.nextInt(w);
int y2 = r.nextInt(h);
g2.setStroke(new BasicStroke(1.5F));
g2.setColor(Color.blue);
g2.drawLine(x1, y1, x2, y2);
}
}

//定义一个随机生成字符的方法
private char randomChar(){
int index = r.nextInt(codes.length());
return codes.charAt(index);
}

//定义一个生成图片缓冲区的方法
private BufferedImage createImage(){
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);//得到图片缓冲区为宽70px 高35px,图片类型为Int RGB
Graphics2D g2 = (Graphics2D) image.getGraphics();//拿起画笔
g2.setColor(this.bgColor);//画笔颜色为定义好的成员变量——背景色 白色
g2.drawRect(0, 0, w, h);//画一个坐标为(0,0)的W H 的矩形
return image;
}

//定义一个可被外界调用的生成验证码图片的方法
public BufferedImage getImage(){
BufferedImage image = createImage();//得到预先做好的画板
Graphics2D g2 = (Graphics2D) image.getGraphics();//再次拿起画笔
StringBuffer sb = new StringBuffer();//创建一个可变字符串对象
for (int i = 0; i < 4; i++) {//循环4次写四个字符
String s = randomChar()+"";//随机得到字符并转成字符串类型
sb.append(s);//把它添加到可变字符串SB末尾
float x = i*1.0F*w/4;//把X轴以FLOAT类型分成4份,一个字符一份
g2.setFont(randomFont());//随机生成字体
g2.setColor(randomColor());//随机生成颜色
g2.drawString(s, x, h-5);//把字写到画板上去
}
this.text = sb.toString();//把得到的4个字符转成String类型赋值给成员变量text
drawLine(image);//对image这个图片进行绘制3条干扰线的操作
return image;
}

//定义一个方法返回验证码中的文本
public String getText() {
return text;
}

//定义一个方法是将生成的验证码图片保存到本地
public static void outPut(BufferedImage image,OutputStream out) throws IOException {
ImageIO.write(image, "JPEG", out);

解决方案 »

  1.   

    生成图片缓冲区的方法里的g2.drawRect(0, 0, w, h)有问题drawRect方法是用来画边框的改成fillRect方法这方法才是填充矩形
      

  2.   

    谢谢大佬~~压根没朝这个方向找问题 哈哈 ~~~再麻烦一下,我JSP页面这样写的,但是验证码图片还是点击没反应~~这是什么问题呢
    <script type="text/javascript">
    function _change(){
    var imgEle = document.getElementById("img");
    //为了避免浏览器缓存验证码图片,让图片路径加一个毫秒参数,让浏览器以为是和上次不一样的
    imgELe.src = "/day03/VerifyCodeServlet?a=" + new Date().getTime();
    }
    </script>  </head>
      
      <body>
       <%--
       1、创建一个变量用于在input标签中输出,给一个初始值用于最初的输出状态
       2、从servlet中获取cookie[]得到所有的请求头 set-Cookies,数组的每个元素都是aaa=AAA这样的值对
       3、判断cookies是否为空,为空则以初始值输出,不为空则循环遍历数组,将getName()是uname的cookie的value赋值给变量,在input中输出在value属性中
        --%>
       <%
      
       String uname = "username";
       Cookie[] cs = request.getCookies();
       if(cs != null){
       for(Cookie c:cs){
          if("uname".equals(c.getName())){
          uname = c.getValue();
          }
          }
      
       }
      
       %>
        <form action="/day03/LoginServlet" method="post">
         用户名:<input type="text" name="username" value="<%=uname%>"/></br>
         密    码:<input type="text" name="password" value="password"/></br>
         验证码:<input type="text" name="yanzheng" size="3"/>
         <img id="img" src="/day03/VerifyCodeServlet" "/>
         <a href="javascript:_change()">换一张</a></br>
         <input type="submit" value="登录">
        </form>
        <%--
        1、和cookie一样的道理,创建一个值为空串的字符串变量
        2、获取request域健为faile的值,如果不为空,则把值赋给变量输出
         --%>
        <%
         String msg = "";
         String message = (String)request.getAttribute("faile");
         if(message!=null){
         msg = message;
         }
        %>
        <font color="red"><b><%=msg %></b></font>
       
      

  3.   

    验证码刷新你不刷页面,那得用ajax啊...
      

  4.   

    你只是改变src而已又没有发送请求当然没反应按照3楼说的使用ajax进行异步请求