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