linux下图片验证码不能正常显示 前段日子刚解决:http://blog.csdn.net/cm4ever/archive/2004/09/22/113145.aspx 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你那个解决方法还是在tomcat下的,我想知道在resin下怎样做? 哦,没看清楚。sorry。我不用resin的,如果他也是.sh启动的话,找到有-D******之类的行,在下面新增就可以了。方法和我文档中的一样。如果不行,你就要考虑xvfb了。 那用xvfb具体怎样做? 我试过在linux命令行键入Xvfb :0 -screen 0 1024x768x16 & ,但也没有成功 好像说使用Xvfb :0 -screen 0 1024x768x16 & ,之前要对Xvfb进行设置,那怎样设置啊?请指教 代码这样: 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();(包括它)后的语句不执行了,这段程序应该没错吧? 这个是可能因为awt中用到了一些与平台有关的东西,当在类unix系统下时使用了xwindow的有关内容,你需要启动你的xserver 并且需要对用户开放连接xserver的权限,具体如下启动xserver initx开放权限xhost +另外如果系统没有DISPLAY设置的话,还需要export DISPLAY=0 sorry 记错了气筒xserver 应该用xinit 我找到了,在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,呵呵。 我是aix下面的,给你我的代码,你再试一下!1.图片位置:/opt/app/virtual/pic/bkPic.jpgservlet:getRandom.javaJSP页面:<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;} }} younggone(牛), 这样不用装xvfb了?据说默认的x server是连不上的,需要装其他x server。比如xvfb。当然我没试过initx命令。 cm4ever(小P)真的很强啊,成功了,谢谢 我稍后结贴 cm4ever(小P) 我在一台红旗得linux上试过是可以的,需要xinit和xhost +(这个很重要,开放连接到xserver的权限。命令具体内容可以看man)...那个Djava.awt.headless=true 是1.4下的,1.3下不行 谢谢楼上。不过1.4版jdk算是经典版本,它的很多api都非常实用。所以我想很多项目都使用了吧。 ckeditor 中,能不能粘贴图片??? http 到 https 数据传输安全的问题! 执行JS后,页面往上缩了 在一个filter中怎样得到一个http请求后的statusCode? 几个关于jsp的简单问题? 字段类型问题:String和Text的问题请教 solr建立nutch爬虫完后索引,出错 JAVA applet jar包签名后不能运行 急!一个格式化数字的问题。 菜鸟求救:用jswdk作web服务器,应该把javabean放到哪里? 求助:如何将Oracle中Blob存储的图片,不经临时文件而直接显示在JSP页面上 一个包的问题
-D******
之类的行,在下面新增就可以了。方法和我文档中的一样。如果不行,你就要考虑xvfb了。
我试过在linux命令行键入Xvfb :0 -screen 0 1024x768x16 & ,但也没有成功
好像说使用Xvfb :0 -screen 0 1024x768x16 & ,之前要对Xvfb进行设置,那怎样设置啊?请指教
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();(包括它)后的语句不执行了,这段程序应该没错吧?
启动xserver
initx
开放权限
xhost +
另外如果系统没有DISPLAY设置的话,还需要export DISPLAY=0
$JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT $EXTRA_JAVA_ARGS";改成
$JAVA_ARGS .= "-Djava.awt.headless=true -Dresin.home=$SERVER_ROOT $EXTRA_JAVA_ARGS";不熟,我不调试了。成功请回复,我将把它写入blog,呵呵。
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;
}
}
}
我稍后结贴
我在一台红旗得linux上试过是可以的,需要xinit和xhost +(这个很重要,开放连接到xserver的权限。命令具体内容可以看man)...
那个Djava.awt.headless=true 是1.4下的,1.3下不行