Chinaunix
标题:
登录验证码不显示图片
[打印本页]
作者:
jiangeb
时间:
2009-02-18 16:45
标题:
登录验证码不显示图片
大家好,我用了一个网上的产生登录验证码的类。已经部署好了,但是运行的时候图片没有产生,是一个红叉。我把这个类贴出来,大家帮看看,浪费大家时间了,谢谢!
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("
ragma","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
= 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,1
);
// 在不同的高度上输出验证码的每个字符
g.drawString("" + rands[0],1,17);
g.drawString("" + rands[1],16,15);
g.drawString("" + rands[2],31,1
;
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);
}
}
}
作者:
starxing
时间:
2009-02-18 17:03
右键查看那个图片的URL,看看有没有这个图片。
作者:
ziggler
时间:
2009-02-18 17:09
错误信息那?
这个供参考
出现问题 Exception thrown : java.lang.NoClassDefFoundError: sun/awt/X11GraphicsEnvironment
google以后发现是 java.awt.headless 问题,但是在websphere上通过 System.setProperty("java.awt.headless","true");
设置不行, 最后通过websphere 的console
应用服务器 -> server1 ->java与进程管理->进程定义->java虚拟机->通用 JVM 参数
添加 -Djava.awt.headless=true
在UNIX/LINUX环境下面,网页图形验证码无法显示
系统报错为: (日志里面看)
java.lang.NoClassDefFoundError: sun/awt/X11GraphicsEnvironment
解决方法:在websphere平台下:主要原因JCE是Java加密扩展,用于加密, SunJCE是Sun的实现. 在websphere下,因为IBM有自己的SunJCE实现, 所以出错.
下载SunJCE的jar包,然后放到Websphere下的jre/lib/ext 目录下,即可.
在TOMCAT的平台下:Linux下图形验证码不能显示,需要在Tomcat或是Resin的启动参数中加-Djava.awt.headless=true
作者:
jiangeb
时间:
2009-02-18 17:24
好象图片没有生成,右键点图片,然后点“属性”,地址是下面这个:
http://localhost/homepage/servlet/CheckCodeServlet
servlet/CheckCodeServlet 这是生成图片的servlet
我的开发环境是Eclipse。servlet放在WEB-INF/src下的servlet包里
请问是怎么回事呢
作者:
hsqsoft
时间:
2009-06-01 14:54
标题:
回复 #1 jiangeb 的帖子
你在web.xml里是怎么配置的?还有页面上是如何写的.?
作者:
jeffyan
时间:
2009-06-23 13:27
直接访问是否还是xx ... 如果是 程序有问题 如果不是 那么img src = ...../imag.jsp
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2