一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - javaWeb如何實現(xiàn)隨機圖片驗證碼詳解

javaWeb如何實現(xiàn)隨機圖片驗證碼詳解

2021-08-30 11:06C--++ Java教程

這篇文章主要給大家介紹了關(guān)于javaWeb如何實現(xiàn)隨機圖片驗證碼的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

實現(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)用成功圖片已流給瀏覽器

獲得圖片:

javaWeb如何實現(xiàn)隨機圖片驗證碼詳解

校驗圖形驗證碼

?
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

延伸 · 閱讀

精彩推薦
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7472021-02-04
主站蜘蛛池模板: 欧美日韩综合一区 | 欧美成人午夜片一一在线观看 | 91综合在线视频 | 日本三级在丈面前被耍了 | 国产v日韩v欧美v精品专区 | 色愉拍亚洲偷自拍 | jizz 日本亚洲 | 女人国产香蕉久久精品 | 成人午夜视频一区二区国语 | avtt在线| 国产盗摄女厕美女嘘嘘 | 免费永久观看美女视频网站网址 | 欧美一区二区三区四区视频 | 久久99热狠狠色一区二区 | 欧美男男xxx激情做受 | 猥琐对着美女飞机喷到脸上 | 亚洲国产欧美在线人成 | 亚欧日韩 | 午夜AV亚洲一码二中文字幕青青 | 欧美a级v片在线观看一区 | 日本中文字幕一区二区高清在线 | 粗了大了 整进去好爽视频 刺激一区仑乱 | 免费在线公开视频 | 五月天视频网 | 亚洲精品一区二区久久久久 | 国产精品免费看久久久香蕉 | 久久电影精品久久99久久 | 91视频完整版 | 日韩永久在线观看免费视频 | aa一级护士医生毛片 | 欧美日韩精品一区二区三区视频在线 | 欧美男人的天堂 | 久久偷拍国2017 | 麻豆视频免费在线观看 | 国产a高清| 毛片免费视频观看 | 色男人综合| 91制片厂制作果冻传媒八夷 | 视频在线观看一区二区三区 | 久久精品黄AA片一区二区三区 | 欧美日韩精品乱国产538 |