Java 验证码 不显示图片

jiangeb 2009-02-18 11:10:46
大家好,我用了一个网上的产生登录验证码的类。已经部署好了,但是运行的时候图片没有产生,是一个红叉。我把这个类贴出来,大家帮看看,浪费大家时间了,谢谢!

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.awt.*;

import java.awt.image.*;

import javax.imageio.ImageIO;



public class CheckCodeServlet extends HttpServlet

{

private static int WIDTH = 60;

private static int HEIGHT = 20;

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException

{

HttpSession session = request.getSession();

response.setContentType("image/jpeg");

ServletOutputStream sos = response.getOutputStream();



// 设置浏览器不要缓存此图片

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-cache");

response.setDateHeader("Expires", 0);



// 创建内存图象并获得其图形上下文

BufferedImage image =

new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics();



// 产生随机的认证码

char [] rands = generateCheckCode();



// 产生图像

drawBackground(g);

drawRands(g,rands);



// 结束图像 的绘制 过程, 完成图像

g.dispose();




// 将图像输出到客户端

ByteArrayOutputStream bos = new ByteArrayOutputStream();

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

byte [] buf = bos.toByteArray();

response.setContentLength(buf.length);

// 下面的语句也可写成: bos.writeTo(sos);

sos.write(buf);

bos.close();

sos.close();



// 将当前验证码存入到 Session 中

session.setAttribute("check_code",new String(rands));

// 直接使用下面的代码将有问题, Session 对象必须在提交响应前获得

//request.getSession().setAttribute("check_code",new String(rands));

}



private char [] generateCheckCode()

{

// 定义验证码的字符表

String chars = "0123456789abcdefghijklmnopqrstuvwxyz";

char [] rands = new char[4];

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

{

int rand = (int)(Math.random() * 36);

rands[i] = chars.charAt(rand);

}

return rands;

}



private void drawRands(Graphics g , char [] rands)

{

g.setColor(Color.BLACK);

g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));

// 在不同的高度上输出验证码的每个字符

g.drawString("" + rands[0],1,17);

g.drawString("" + rands[1],16,15);

g.drawString("" + rands[2],31,18);

g.drawString("" + rands[3],46,16);

System.out.println(rands);

}



private void drawBackground(Graphics g)

{

// 画背景

g.setColor(new Color(0xDCDCDC));

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

// 随机产生 120 个干扰点

for(int i=0; i<120; i++)

{

int x = (int)(Math.random() * WIDTH);

int y = (int)(Math.random() * HEIGHT);

int red = (int)(Math.random() * 255);

int green = (int)(Math.random() * 255);

int blue = (int)(Math.random() * 255);

g.setColor(new Color(red,green,blue));

g.drawOval(x,y,1,0);

}

}

}
...全文
1622 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzsmile1114 2009-02-18
  • 打赏
  • 举报
回复
也许考虑复杂了,没看代码,有种情况是通过jsp跳转,涉及到浏览器的安全级别,一种可能而已。
zou_wei_forever 2009-02-18
  • 打赏
  • 举报
回复
将jsp文件所在的路径及servlet配置的映射路径贴出来啊
blueram 2009-02-18
  • 打赏
  • 举报
回复
我刚试了下,直接敲入路径,可是显示,代码没有问题。
你的页面路径有问题
blueram 2009-02-18
  • 打赏
  • 举报
回复
在web.xml里面配置好了,直接敲入路径看看可以显示不,
如果可以
就是jsp页面的图片途径错误了
raulluxin 2009-02-18
  • 打赏
  • 举报
回复
我也出现这种问题了,期待高手解决...

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧