實現(xiàn)步驟
1:java后臺生成一張隨機數(shù)字/字母/漢字驗證碼的圖片。
2:存入redis或者session。
3:用戶輸入驗證碼跟redis取出數(shù)據(jù)做比對。
圖片生成工具類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
public class randomvalidatecodeutil { public static final string randomcodekey = "randomvalidatecodekey" ; //放到session中的key private string randstring = "0123456789" ; //隨機產(chǎn)生只有數(shù)字的字符串 private string //private string randstring = "abcdefghijklmnopqrstuvwxyz";//隨機產(chǎn)生只有字母的字符串 //private string randstring = "0123456789abcdefghijklmnopqrstuvwxyz";//隨機產(chǎn)生數(shù)字與字母組合的字符串 private int width = 95 ; // 圖片寬 private int height = 25 ; // 圖片高 private int linesize = 40 ; // 干擾線數(shù)量 private int stringnum = 4 ; // 隨機產(chǎn)生字符數(shù)量 private static final logger logger = loggerfactory.getlogger(randomvalidatecodeutil. class ); private random random = new random(); /** * 獲得字體 */ private font getfont() { return new font( "fixedsys" , font.center_baseline, 18 ); } /** * 獲得顏色 */ private color getrandcolor( int fc, int bc) { if (fc > 255 ) { fc = 255 ; } if (bc > 255 ) { bc = 255 ; } int r = fc + random.nextint(bc - fc - 16 ); int g = fc + random.nextint(bc - fc - 14 ); int b = fc + random.nextint(bc - fc - 18 ); return new color(r, g, b); } /** * 生成隨機圖片 */ public string getrandcode(httpservletrequest request, httpservletresponse response) { httpsession session = request.getsession(); // bufferedimage類是具有緩沖區(qū)的image類,image類是用于描述圖像信息的類 bufferedimage image = new bufferedimage(width, height, bufferedimage.type_int_bgr); graphics g = image.getgraphics(); // 產(chǎn)生image對象的graphics對象,改對象可以在圖像上進行各種繪制操作 g.fillrect( 0 , 0 , width, height); //圖片大小 g.setfont( new font( "default" , font.roman_baseline, 18 )); //字體大小 g.setcolor(getrandcolor( 110 , 133 )); //字體顏色 // 繪制干擾線 for ( int i = 0 ; i <= linesize; i++) { drowline(g); } // 繪制隨機字符 string randomstring = "" ; for ( int i = 1 ; i <= stringnum; i++) { randomstring = drowstring(g, randomstring, i); } logger.info(randomstring); g.dispose(); try { // 將內(nèi)存中的圖片通過流動形式輸出到客戶端 imageio.write(image, "jpeg" , response.getoutputstream()); } catch (exception e) { logger.error( "將內(nèi)存中的圖片通過流動形式輸出到客戶端失敗>>>> " , e); } return randomstring; } /** * 繪制字符串 */ private string drowstring(graphics g, string randomstring, int i) { g.setfont(getfont()); g.setcolor( new color(random.nextint( 101 ), random.nextint( 111 ), random .nextint( 121 ))); string rand = string.valueof(getrandomstring(random.nextint(randstring .length()))); randomstring += rand; g.translate(random.nextint( 3 ), random.nextint( 3 )); g.drawstring(rand, 13 * i, 16 ); return randomstring; } /** * 繪制干擾線 */ private void drowline(graphics g) { int x = random.nextint(width); int y = random.nextint(height); int xl = random.nextint( 13 ); int yl = random.nextint( 15 ); g.drawline(x, y, x + xl, y + yl); } /** * 獲取隨機的字符 */ public string getrandomstring( int num) { return string.valueof(randstring.charat(num)); } } |
使用工具類生成
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
@getmapping (value = "/getverify" ) @apioperation ( "生成圖片驗證碼" ) public void getverify(httpservletrequest request, httpservletresponse response) { try { //設(shè)置相應(yīng)類型,告訴瀏覽器輸出的內(nèi)容為圖片 response.setcontenttype( "image/jpeg" ); //設(shè)置響應(yīng)頭信息,告訴瀏覽器不要緩存此內(nèi)容 response.setheader( "pragma" , "no-cache" ); response.setheader( "cache-control" , "no-cache" ); response.setdateheader( "expire" , 0 ); randomvalidatecodeutil randomvalidatecode = new randomvalidatecodeutil(); //輸出驗證碼圖片方法 string randcode = randomvalidatecode.getrandcode(request, response); // 將隨機生成的字符串放在redis中 redisutil.save( "random" , randcode); // 將生成的隨機字符串保存到session中 // httpsession session = request.getsession(); // session.removeattribute(randomcodekey); // session.setattribute(randomcodekey, randomstring); } catch (exception e) { log.error( "獲取驗證碼失敗>>>> " , e); } } |
當(dāng)有請求進來時
1:告訴瀏覽器如何接收圖片。
2:使用工具類生成圖片 。
3:將驗證碼存入redis或者seesion。
4:調(diào)用成功圖片已流給瀏覽器
獲得圖片:
校驗圖形驗證碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
@postmapping ( "/checkverify" ) @apioperation ( "校驗圖形驗證碼" ) public string checkvalidatecode(string verify) { // 校驗驗證碼 try { // 從redis中獲取驗證碼 string random = (string) redisutil.findkey( "random" ); // 從ression中獲取驗證碼 httpsession session = request.getsession(); string random = session.getattribute( "random" ); log.info( "獲取的隨機數(shù) random = {}" , random); if (org.springframework.util.stringutils.isempty(verify)) { return "沒有輸入驗證碼" ; } if (verify.equals(random)) { redisutil.delkey( "random" ); } else { return "驗證碼錯誤" ; } } catch (exception e) { log.error( "驗證碼校驗失敗" , e); return "服務(wù)器異常" ; } return "成功" ; } |
驗證:從redis或者seesion取出存入的驗證碼與用戶輸入的比對,相同驗證成功,反之驗證失敗。
總結(jié)
到此這篇關(guān)于javaweb如何實現(xiàn)隨機圖片驗證碼的文章就介紹到這了,更多相關(guān)javaweb隨機圖片驗證碼內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/jhoeeee/article/details/115234218