免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 20092 | 回复: 5
打印 上一主题 下一主题

登录验证码不显示图片 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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);

              }

      }

}

论坛徽章:
0
2 [报告]
发表于 2009-02-18 17:03 |只看该作者
右键查看那个图片的URL,看看有没有这个图片。

论坛徽章:
0
3 [报告]
发表于 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

论坛徽章:
0
4 [报告]
发表于 2009-02-18 17:24 |只看该作者
好象图片没有生成,右键点图片,然后点“属性”,地址是下面这个:
http://localhost/homepage/servlet/CheckCodeServlet

servlet/CheckCodeServlet 这是生成图片的servlet  

我的开发环境是Eclipse。servlet放在WEB-INF/src下的servlet包里
请问是怎么回事呢

论坛徽章:
0
5 [报告]
发表于 2009-06-01 14:54 |只看该作者

回复 #1 jiangeb 的帖子

你在web.xml里是怎么配置的?还有页面上是如何写的.?

论坛徽章:
0
6 [报告]
发表于 2009-06-23 13:27 |只看该作者
直接访问是否还是xx ... 如果是 程序有问题  如果不是 那么img src = ...../imag.jsp
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP