jsp显示验证码问题

来源:互联网 发布:淘宝主图的要求 编辑:程序博客网 时间:2024/05/01 16:02

公司网站登录页面上使用了一个验证码(附录B),前天将weblogic8.1服务器(使用jdk1.4.1)部署到一台没有显卡的Solaris机器上时,图片无法显示,报错:
<2007-6-11 下午06时49分35秒 CST> <Error> <HTTP> <BEA-101017> <[ServletContext(id=11683292,name=DefaultWebApp,context-path=)] Root cause of ServletException.
java.lang.NoClassDefFoundError
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:141)
        at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:62)
        at java.awt.Font.initializeFont(Font.java:308)
        at java.awt.Font.<init>(Font.java:344)
        at cn.jsfund.utility.VerifyCode.<init>(Unknown Source)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:274)
        at java.lang.Class.newInstance0(Class.java:308)
        at java.lang.Class.newInstance(Class.java:261)
        at weblogic.servlet.internal.ServletStubImpl$ServletInitAction.run(ServletStubImpl.java:1016)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
        at weblogic.servlet.internal.ServletStubImpl.createServlet(ServletStubImpl.java:894)
        at weblogic.servlet.internal.ServletStubImpl.createInstances(ServletStubImpl.java:873)
        at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:812)
        at weblogic.servlet.internal.ServletStubImpl.getServlet(ServletStubImpl.java:535)
        at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:373)
        at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:315)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:6452)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:118)
        at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3661)
        at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2630)
        at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:219)
        at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:178)
>

到网上搜索了一下解决办法,
1)升级jdk到jdk1.4.1以上,weblogic的启动参数中增加-Djava.awt.headless=true(weblogic server 7.0只认证了jdk1.3,所以不能保证一定能用jdk1.4.1,这个做法风险比较大。)
2)下载Xvfb虚拟一个XWindows环境(sun provides a workaround to resolve the issue for jdk version prior to jdk 1.4.1. pls download an Xvfb ("pseudo X-server") to emulate XWindows)
3)替换sun的AWT类库(Pls download a pja (Pure Java AWT) to replace the sun awt component,http://www.eteks.com/pja/en/)

附录A:开源的验证码生成程序(sourceforge上一个项目)
http://simplecaptcha.sourceforge.net/imp.html

附录B:网上流行的一个验证码生成程序(jsp版本或servlet版本,代码基本相同)
package cn.jsfund.utility;

import java.io.*;
import java.util.*;
import com.sun.image.codec.jpeg.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;

public class VerifyCode extends HttpServlet {
    private Font mFont = new Font("Times New Roman", Font.PLAIN, 18); //设置字体

    //处理post提交
    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        doGet(request, response);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        //取得一个1000-9999的随机数

        HttpSession session = request.getSession(false);

        int width = 60, height = 20; // 图片宽度、高度
        ServletOutputStream out = response.getOutputStream();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 设置图片大小
        Graphics g = image.getGraphics(); // 作图对象
        Random random = new Random(); // should we call Random(seed)?;

        // 设置输出文件头
        response.setContentType("image/gif");
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
       
        g.setColor(getRandColor(200, 250)); //设置背景色
        g.fillRect(0, 0, width, height);

        g.setColor(Color.black); //设置字体色
        g.setFont(mFont);

        /* g.setColor(new Color(0));
           g.drawRect(0,0,width-1,height-1);*/

        // 随机产生64条干扰线,使图象中的认证码不易被其它程序探测到
        g.setColor(getRandColor(160, 200));
        for (int i = 0; i < 64; i++) { //
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x, y, x + xl, y + yl);
        }

        // 取随机产生的认证码(4位数字)
        String sRand = "";
        for (int i = 0; i < 4; i++) {
            String rand = String.valueOf(random.nextInt(10));
            sRand += rand;

            // 将认证码显示到图象中
            g.setColor(new Color(20 + random.nextInt(110),
                        20 + random.nextInt(110),
                        20 + random.nextInt(110))); //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
            g.drawString(rand, 13 * i + 6, 16);
        }
   
        // 将认证码存入SESSION
        session.setAttribute("RANDOMICITYNUM",sRand);

        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
        /*
        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);

        param.setQuality(1.0f, false);
        encoder.setJPEGEncodeParam(param);
        */
        encoder.encode(image);
        out.close();
    }

    static Color getRandColor(int fc, int bc) { //给定范围获得随机颜色
        Random random = new Random();

        if (fc > 255) fc = 255;
        if (bc > 255) bc = 255;

        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }

原创粉丝点击