簡介: Java web項目中,在後端隨機生成一個驗證碼,繪製成圖像,併在圖像上添加兩條幹擾線,發送到瀏覽器,供用戶使用。 本片博文內容包括,功能實現的邏輯步驟,Java實現代碼,生成的驗證碼圖片展示。 步驟一:生成一個包含四個字元的字元串 使用一個數組char[]+一個Random對象實現該功能。 ...
簡介:
Java web項目中,在後端隨機生成一個驗證碼,繪製成圖像,併在圖像上添加兩條幹擾線,發送到瀏覽器,供用戶使用。
本片博文內容包括,功能實現的邏輯步驟,Java實現代碼,生成的驗證碼圖片展示。
步驟一:生成一個包含四個字元的字元串
使用一個數組char[]+一個Random對象實現該功能。代碼如下:
private char code[]={
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M',
'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2',
'3', '4', '5', '6', '7', '8', '9' };
Random rd = new Random();
String result = "";
for(int i = 0;i < 4;i++ ){
result+=code[rd.nextInt[code.length]];
}
步驟二:繪製圖片
使用一個BufferdImage對象,Graphics對象,Font對象
BufferedImage類:一個圖像類,它生成的圖像在記憶體中占有一個緩存區。
使用方法有兩種:
1.讀取一個已經存在的圖片文件到BufferedImage對象的緩存區中,然後對該圖片文件進行操作。
BufferedImage b = ImageIO.read(new FileOutputStream(File f));
2.創建一個BufferedImage對象,然後通過Graphics對象對其進行繪製。
BufferedImage b = new BufferedImage(int width,int height,IndexColorModel cn); //設定圖片的寬度,高度,顏色設定模式
Graphics g = b.getGraphics(); //得到圖片繪製器
3.Graphics對象常用方法
g.setColor(Color color);
g.fillRect(int x,int y,int width,int heigh) //兩個一組,為圖片的指定位置設置顏色,以圖片的左下角為原點,(x,y)為繪製圖片的左下
//角坐標,繪製面積為width,height。
g.drawString(String s,int x,int y) //在(x,y)坐標系下繪製字元串,坐標系原點為BufferedImage的左下角
g.drawLine(int x1,int y1,int x2,int y2) //在兩點之間繪製一條直線,顏色使用最近的g.setColor()設定。
g.dispose() //釋放正在使用的系統資源
1 BufferdImage bufferedImage = new BufferedImage(50,30,BufferedImage.TYPE_INT_BGR); 2 Graphics graphics = bufferedImage.getGraphics(); 3 Font font = new Font("Arial",Font.TRUETYPE_FONT,18); 4 //設置背景顏色,並填充 5 graphics.setColor(new Color(rd.nextInt(55)+200,rd.nextInt(55)+20,rd.nextInt(55)+200)); 6 graphics.fillRect(0,0,WIDTH,HEIGH); //設定要填充的矩形的坐標(x,y),矩形的寬度和高度 7 //邊框顏色 8 graphics.setColor(Color.black); 9 graphics.fillRect(0,0,WIDTH-1,HEIGH-1); 10 //設置字體 11 graphics.setFont(font); 12 for (int i = 0; i <result.length() ; i++) { 13 g.setColor(new Color(rd.nextInt(200),rd.nextInt(200),rd.nextInt(200))); 14 g.drawString(result.charAt(i)+"",12*i+1,16); //需要繪製的字元串,繪製的位置。 15 } 16 for (int i = 0; i < 2 ; i++) { 17 g.setColor(new Color(rd.nextInt(200),rd.nextInt(200),rd.nextInt(200))); 18 int x1 = rd.nextInt(WIDTH); 19 int x2 = rd.nextInt(WIDTH); 20 int y1 = rd.nextInt(HEIGH); 21 int y2 = rd.nextInt(HEIGH); 22 g.drawLine(x1,y1,x2,y2); 23 }
步驟三:將圖片發送到瀏覽器端,存放此次產生的驗證碼中的字元串
設置瀏覽器端不能緩存驗證碼圖片
Pragma功能變數名稱:用來包含實現特定的指令,Pragma:No-cache(不允許緩存響應或請求報文)
Cache-Controller功能變數名稱:在HTTP:1.1中使用,指定緩存規則。
response.setHeader("Pragma","No-cache"); //通知瀏覽器不要使用緩存功能 response.setHeader("Cache-Control","no-cache"); //通知瀏覽器不要緩存 response.setDateHeader("Expires",0);
設置響應的媒體類型
response.setContentType("image/jpeg");
將驗證碼中的字元串發送到session中,以便驗證時從session中獲取
session.setAttribute("code",result);
將驗證碼圖片發送給瀏覽器端
1 try{ 2 OutputStream os = reponse.getOutputStream(); 3 ImageIo.write(image,"JPEG",os); 4 }catch(IOException e){ 5 e.printStackTrace(); 6 }
ImageIO類:
圖像讀寫工具類,提供靜態方法來將任意格式的圖片讀取到記憶體中或寫入到文件中。