linux下图片验证码不能正常显示

lamyuu 2004-09-27 07:58:41
我写了一个servlet来实现图片验证码的功能,在window下正常显示,但放到linux后就显示不出来。
我上网查看了一些资料,找到了几个类似问题的帖子,但里面提到的都是对应tomcat,weblogic的解决方法,请问服务器是resin的情况下怎样解决?例如在哪加入运行参数 –Djava.awt.headless=true ?
...全文
770 点赞 收藏 15
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
禽兽v5 2004-10-05
谢谢楼上。

不过1.4版jdk算是经典版本,它的很多api都非常实用。所以我想很多项目都使用了吧。
回复
sjtsh 2004-09-28
gz
回复
禽兽v5 2004-09-28
哦,没看清楚。sorry。我不用resin的,如果他也是.sh启动的话,找到有
-D******
之类的行,在下面新增就可以了。方法和我文档中的一样。

如果不行,你就要考虑xvfb了。
回复
禽兽v5 2004-09-28
过奖。一点工作经验,也就是熟手程度而已。
回复
lamyuu 2004-09-28
cm4ever(小P)真的很强啊,成功了,谢谢
我稍后结贴
回复
禽兽v5 2004-09-28
younggone(牛), 这样不用装xvfb了?据说默认的x server是连不上的,需要装其他x server。比如xvfb。当然我没试过initx命令。
回复
koma_wind 2004-09-28
我是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;
}
}
}
回复
禽兽v5 2004-09-28
我找到了,在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,呵呵。
回复
younggone 2004-09-28
sorry 记错了气筒xserver 应该用xinit
回复
younggone 2004-09-28
这个是可能因为awt中用到了一些与平台有关的东西,当在类unix系统下时使用了xwindow的有关内容,你需要启动你的xserver 并且需要对用户开放连接xserver的权限,具体如下
启动xserver
initx
开放权限
xhost +
另外如果系统没有DISPLAY设置的话,还需要export DISPLAY=0

回复
lamyuu 2004-09-28
代码这样:
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();(包括它)后的语句不执行了,这段程序应该没错吧?
回复
lamyuu 2004-09-28
那用xvfb具体怎样做?
我试过在linux命令行键入Xvfb :0 -screen 0 1024x768x16 & ,但也没有成功
好像说使用Xvfb :0 -screen 0 1024x768x16 & ,之前要对Xvfb进行设置,那怎样设置啊?请指教
回复
younggone 2004-09-28
cm4ever(小P)
我在一台红旗得linux上试过是可以的,

需要xinit和xhost +(这个很重要,开放连接到xserver的权限。命令具体内容可以看man)...
那个Djava.awt.headless=true 是1.4下的,1.3下不行
回复
lamyuu 2004-09-27
你那个解决方法还是在tomcat下的,我想知道在resin下怎样做?
回复
禽兽v5 2004-09-27
前段日子刚解决:

http://blog.csdn.net/cm4ever/archive/2004/09/22/113145.aspx
回复
发动态
发帖子
Web 开发
创建于2007-09-28

7.9w+

社区成员

Java Web 开发
申请成为版主
社区公告
暂无公告