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 ValidateCode extends HttpServlet {
private Font mFont=new Font("宋體", Font.PLAIN,12);//設定字型
//處理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的隨機數
String s="";
int intCount=0;
intCount=(new Random()).nextInt(9999);//
if(intCount<1000)intCount+=1000;
s=intCount+"";
//儲存入session,用於與使用者的輸入進行比較.
//注意比較完之後清除session.
HttpSession session=request.getSession (true);
session.setAttribute("validateCode",s);
response.setContentType("image/gif");
ServletOutputStream out=response.getOutputStream();
BufferedImage image=new BufferedImage(35,14,BufferedImage.TYPE_INT_RGB);
Graphics gra=image.getGraphics();
//設定背景色
gra.setColor(Color.yellow);
gra.fillRect(1,1,33,12);
//設定字型色
gra.setColor(Color.black);
gra.setFont(mFont);
//輸出數字
char c;
for(int i=0;i<4;i++) {
c=s.charAt(i);
gra.drawString(c+"",i*7+4,11); //7為寬度,11為上下高度位置
}
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
}
}
java的圖片處理包需要圖形環境,而linux上沒有啟動圖形環境,找不到圖形環境的server(X11 window server using ':0.0' )所以會報這個錯。而通過java -Djava.awt.headless=true 這個參數的指定就可以避免java 2d去找圖形環境。
要麼這樣試試,應該也可以。在servlet裡一開始寫一句:
System.setProperty("java.awt.headless","true");
web伺服器的java虛擬機器必須加以個參數java.awt.headless=true
以tomcat為例
可以在/etc/profile或啟動web服務的使用者的.bash_profile中的CATALINA_OPTS變數中加入:
CATALINA_OPTS="... -Djava.awt.headless=true"
其他的也可以看看啟動指令碼。只要加上這個參數就沒問題了。