前段日子刚解决:http://blog.csdn.net/cm4ever/archive/2004/09/22/113145.aspx

解决方案 »

  1.   

    你那个解决方法还是在tomcat下的,我想知道在resin下怎样做?
      

  2.   

    哦,没看清楚。sorry。我不用resin的,如果他也是.sh启动的话,找到有
    -D******
    之类的行,在下面新增就可以了。方法和我文档中的一样。如果不行,你就要考虑xvfb了。
      

  3.   

    那用xvfb具体怎样做?
      我试过在linux命令行键入Xvfb :0 -screen 0 1024x768x16 & ,但也没有成功
      好像说使用Xvfb :0 -screen 0 1024x768x16 & ,之前要对Xvfb进行设置,那怎样设置啊?请指教
      

  4.   

    代码这样:
      package mypackage;  import java.awt.*;
      import java.awt.image.*;
      import javax.imageio.*;
      import java.util.*;
      import javax.servlet.http.*;
      import javax.servlet.*;
      import java.io.*;/**
     * 认证码绑定Session名字:rand
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2004</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */
    public class Validate extends HttpServlet{  private static final String CONTENT_TYPE = "text/html; charset=GBK";
      private ServletConfig config;  final public void init(ServletConfig config) throws ServletException {
       this.config = config;
     } final public ServletConfig getServletConfig() {
       return config;
     } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType(CONTENT_TYPE);
        response.setHeader("Pragma","No-cache");              //设置页面不缓存
        response.setHeader("Cache-Control","no-cache");
        response.setDateHeader("Expires", 0);
        request.setCharacterEncoding("GBK");
        //PrintWriter out = response.getWriter();
        System.out.println("******&&&*******");
        try{
          createImage(request, response);
        }catch(Exception e){e.printStackTrace();}
      }  /**
       * 数字图像认证系统
       * 随机产生一个四位的数组,转换成图象输出
       * 产生的数组保存在Session中,绑定名字“rand”
       */
      public void createImage(HttpServletRequest request,HttpServletResponse response){
        HttpSession session = request.getSession();
        int width = 50,height = 20;
        //创建图像
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        //获取图像上下文
        Graphics g = image.getGraphics();
        System.out.println("*****--"+image+"--*****");
        //定义图像背景
        g.setColor(Color.white);
        g.fillRect(0, 0, width, height);
        //定义图像边框
        g.setColor(Color.black);
        g.drawRect(0, 0, width - 1, height - 1);
        //随机产生四位认证码
        double i = java.lang.Math.random();
        String temp = String.valueOf(i * 10000);
        temp = temp.substring(0, temp.indexOf("."));
        String rand;
        switch (temp.length()) {
            case 1:
              rand = "000" + temp;
              break;
            case 2:
              rand = "00" + temp;
              break;
            case 3:
              rand = "0" + temp;
              break;
            default:
              rand = temp.substring(0, 4);
              break;
          }
        //将认证码写进Session
        session.setAttribute("rand", rand);
        //将认证码写入图像
        g.setColor(Color.black);
        g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
        g.drawString(rand, 8, 15);
        //随机产生88个干扰点,使图象中的认证码不易被其它程序探测到
        Random random = new Random();
        for (int j = 0; j < 88; j++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            g.drawLine(x, y, x, y);
          }
        //图像生效
        g.dispose();
        //输出图像
        try{
          ImageIO.write(image, "JPEG", response.getOutputStream());
        }catch(Exception e){
          e.printStackTrace();
        }
      }
    }我用System.out.println()来检查代码,发现Graphics g = image.getGraphics();(包括它)后的语句不执行了,这段程序应该没错吧?
      

  5.   

    这个是可能因为awt中用到了一些与平台有关的东西,当在类unix系统下时使用了xwindow的有关内容,你需要启动你的xserver 并且需要对用户开放连接xserver的权限,具体如下
    启动xserver  
    initx
    开放权限
    xhost +
    另外如果系统没有DISPLAY设置的话,还需要export DISPLAY=0
      

  6.   

    sorry 记错了气筒xserver 应该用xinit
      

  7.   

    我找到了,在resin/bin/wrapper.pl第552 行,将
    $JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT $EXTRA_JAVA_ARGS";改成
    $JAVA_ARGS .= "-Djava.awt.headless=true -Dresin.home=$SERVER_ROOT $EXTRA_JAVA_ARGS";不熟,我不调试了。成功请回复,我将把它写入blog,呵呵。
      

  8.   

    我是aix下面的,给你我的代码,你再试一下!
    1.图片位置:/opt/app/virtual/pic/bkPic.jpg
    servlet:getRandom.java
    JSP页面:<img align=absbottom vspace=2 border=0 src="/getRandom">
    package randomPic.servlet;import java.io.*;
    import java.util.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.awt.*;
    import java.awt.image.*;
    import java.awt.image.BufferedImage;
    import com.sun.image.codec.jpeg.*;
    import com.sun.image.codec.jpeg.JPEGCodec;public class getRandom extends BankServlet
    {
    public void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {
    int i = (int)(java.lang.Math.random()*1000000);
    String strRandomNum = ""+i;
    while(strRandomNum.length()<6)
    strRandomNum = "0"+strRandomNum ;
    request.getSession().setAttribute("RandomNom",strRandomNum); 
    try
    {
    ServletOutputStream out=response.getOutputStream();
    //jpg格式的背景色图片(于页面风格一样),宽3.6毫米,高1.8毫米
    InputStream imageIn = new FileInputStream(new File("/opt/app/virtual/pic/bkPic.jpg"));
    JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn);
    BufferedImage image4 = decoder.decodeAsBufferedImage();Graphics g = image4.getGraphics();
    g.setColor(new Color(0,255,0));
    g.drawString(strRandomNum,0,13);JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    encoder.encode(image4);
    out.close();

    catch (Exception ex)
    {
    ex.printStackTrace();
    System.out.println("Error="+ex);
    return;
    }       
    }
    }
      

  9.   

    younggone(牛), 这样不用装xvfb了?据说默认的x server是连不上的,需要装其他x server。比如xvfb。当然我没试过initx命令。
      

  10.   

    cm4ever(小P)真的很强啊,成功了,谢谢
      我稍后结贴
      

  11.   

    cm4ever(小P) 
    我在一台红旗得linux上试过是可以的,需要xinit和xhost +(这个很重要,开放连接到xserver的权限。命令具体内容可以看man)...
    那个Djava.awt.headless=true 是1.4下的,1.3下不行
      

  12.   

    谢谢楼上。不过1.4版jdk算是经典版本,它的很多api都非常实用。所以我想很多项目都使用了吧。