欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

探討Java驗證碼制作(上篇)

 更新時間:2016年05月15日 12:33:51   作者:Try.Catch  
很多朋友對驗證碼并不陌生,無論是申請賬號還是某些情況下登錄時都會要求輸入驗證碼。接下來通過本文給大家介紹java驗證碼制作的方法,感興趣的朋友一起學(xué)習(xí)吧

相信大家對驗證碼這玩意不會陌生,無論是申請賬號還是某些情況下登錄時都會要求輸入驗證碼。經(jīng)過統(tǒng)計,驗證碼一次驗證就成功通過的概率是90%,并不高,那么很多人對于這種降低用戶體驗度的設(shè)計肯定會懷疑他的必要性,但黑格爾說過:凡是合乎理性的東西都是現(xiàn)實的;凡是現(xiàn)實的東西都是合乎理性的。接下來我們來了解一下驗證碼。

驗證碼是一種區(qū)別用戶是計算機(jī)還是人的公共全自動程序,他被用于防止惡意破解密碼、刷票、論壇灌水,防止黑客通過暴力破解方式不斷地登錄,應(yīng)用于銀行、社區(qū)、論壇、投票系統(tǒng)等等。

廢話不多說我們來看看我已知的用Java實現(xiàn)驗證碼的四種方式。

方法一:

第一種方法是我最先想到的,也是實現(xiàn)邏輯最簡單的,但效率、安全性極其不高。

具體操作就是:1、用photoshop制作出驗證碼圖片,矩形圖片上可有必要的英文字母、數(shù)字或中文(如上)

2、將圖片顯示在swing控件中或是jsp頁面中

3、在代碼中為每張圖片匹配上相應(yīng)的驗證碼字符串

4、在提交時獲取組件或文本框中的字符串與每張圖片的字符串用equals()方法進(jìn)行比較

缺憾就是制作驗證碼圖片的過程太費時,實現(xiàn)方法極low,極不推薦這樣實現(xiàn),下面的方法將越來越高效美觀相對安全。

方法二:

這里講Java Web,Servlet下的驗證碼實現(xiàn),實現(xiàn)起來邏輯還是很清晰的。

省去較簡單的實現(xiàn)代碼,我們先從前臺關(guān)鍵代碼說起:

當(dāng)我們點擊"看不清"時,驗證碼圖片會進(jìn)行一個刷新,會調(diào)用一個js函數(shù)用于重新設(shè)置圖片路徑來更換圖片,請看下面代碼,代碼中<%=request.getContextPath()%>是為了解決相對路徑的問題,可返回站點的根路徑,而/servlet/ImageServlet是一個整體,指向的就是ImageServlet這個servlet,為什么要在之前加個/servlet呢,因為我們在web.xml中做了配置映射,可理解為換了個更長的名稱。接著看下面js函數(shù),可能有些人會有疑問,為什么獲取一個當(dāng)前時間然后加在路徑最后呢,其實這是為了解決瀏覽器緩存的問題,就是當(dāng)觸發(fā)了ImageServlet后雖然驗證碼圖片換了但緩存還沒變顯示出來的驗證碼圖片不變的問題,借助每時每刻時間不同可以讓瀏覽器緩存失效。

<script type="text/javascript">
  function reloadCode(){
   var time = new Date().getTime();
   document.getElementById("imagecode").src="<%=request.getContextPath() %>/servlet/ImageServlet?d="+time;
  }
 </script>

下面是web.xml中的關(guān)鍵配置信息:

<script type="text/javascript">
 function reloadCode(){
  var time = new Date().getTime();
  document.getElementById("imagecode").src="<%=request.getContextPath() %>/servlet/ImageServlet?d="+time;
 }
 </script>

然后我們看關(guān)鍵的ImageServlet是怎么生成圖片的:

<servlet>
  <servlet-name>ImageServlet</servlet-name>
  <servlet-class>com.muke.ImageServlet</servlet-class>
 </servlet>
 <servlet>
  <servlet-name>LoginServlet</servlet-name>
  <servlet-class>com.muke.LoginServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>ImageServlet</servlet-name>
  <url-pattern>/servlet/ImageServlet</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>LoginServlet</servlet-name>
  <url-pattern>/servlet/LoginServlet</url-pattern>
 </servlet-mapping> 

如果要更生動的描述這種驗證碼是怎么樣來實現(xiàn)的,那么就一個字“畫”,聽上去和第一種方法類似,還是比較low,但是用代碼來自動“畫”出驗證碼效率絕對翻了無數(shù)倍。我們來看上述代碼,首先實例化了一個BufferedImage對象bi,bi是用來畫出那張驗證碼圖片的,然后用bi得到一支畫筆g,用g畫出了實體的矩形背景,接著用簡單的邏輯通過畫筆g調(diào)用Java中常用的drawString()方法在矩形上畫出驗證碼字符,同時將字符串依次加入StringBuffer可變字符串對象中,最后存入jsp內(nèi)置對象session中以便提交驗證碼后的比對,為了顯示出驗證碼,我們還需將生成驗證碼圖片以某種圖片格式寫入ImageIO流。

下面LoginServlet中可以看出,獲取剛剛ImageServlet存入session的字符串就可以進(jìn)行與驗證碼提交框中字符串的比對了,可以把字符串都變?yōu)樾懟虼髮懽鲆粋€忽略大小寫的處理。

 public class ImageServlet extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
  BufferedImage bi = new BufferedImage(,,BufferedImage.TYPE_INT_RGB);
  Graphics g = bi.getGraphics();
  Color c = new Color(,,);
  g.setColor(c);
  g.fillRect(, , , );
  char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
  Random r = new Random();
  int len=ch.length,index;
  StringBuffer sb = new StringBuffer();
  for(int i=; i<; i++){
  index = r.nextInt(len);
  g.setColor(new Color(r.nextInt(),r.nextInt(),r.nextInt()));
  g.drawString(ch[index]+"", (i*)+, );
  sb.append(ch[index]);
  }
  request.getSession().setAttribute("piccode", sb.toString());
  ImageIO.write(bi, "JPG", response.getOutputStream());
 }
 }

下面是實現(xiàn)圖例:

以上所述是小編給大家介紹的Java驗證碼制作的相關(guān)知識,希望對大家有所幫助!后續(xù)給大家介紹java驗證碼制作(下),感興趣的朋友敬請關(guān)注腳本之家網(wǎng)站!

相關(guān)文章

  • 淺析mybatis和spring整合的實現(xiàn)過程

    淺析mybatis和spring整合的實現(xiàn)過程

    據(jù)官方的說法,在Mybatis3問世之前,Spring3的開發(fā)工作就已經(jīng)完成了,所以Spring3中還是沒有對Mybatis3的支持。因此由Mybatis社區(qū)自己開發(fā)了一個Mybatis-Spring用來滿足Mybatis用戶整合Spring的需求,下面通過Mybatis-Spring來整合Mybatis跟Spring的用法做介紹
    2015-10-10
  • 詳解在SpringBoot應(yīng)用中獲取應(yīng)用上下文方法

    詳解在SpringBoot應(yīng)用中獲取應(yīng)用上下文方法

    本篇文章主要介紹了詳解在SpringBoot應(yīng)用中獲取應(yīng)用上下文方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • java實現(xiàn)KFC點餐系統(tǒng)

    java實現(xiàn)KFC點餐系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)KFC點餐系統(tǒng),模擬肯德基快餐店的收銀系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Spring?Boot?優(yōu)雅停機(jī)原理詳解

    Spring?Boot?優(yōu)雅停機(jī)原理詳解

    這篇文章主要為大家介紹了Spring?Boot?優(yōu)雅停機(jī)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • java面向?qū)ο罄^承與多態(tài)介紹

    java面向?qū)ο罄^承與多態(tài)介紹

    大家好,本篇文章主要講的是java面向?qū)ο罄^承與多態(tài)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • java中jdbcTemplate的queryForList(坑)

    java中jdbcTemplate的queryForList(坑)

    本文主要介紹了java中jdbcTemplate的queryForList,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 一篇文章帶你玩轉(zhuǎn)Spring bean的終極利器

    一篇文章帶你玩轉(zhuǎn)Spring bean的終極利器

    這篇文章主要給大家介紹了關(guān)于玩轉(zhuǎn)Spring bean的終極利器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring bean具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • java中@NotBlank限制屬性不能為空

    java中@NotBlank限制屬性不能為空

    在實體類的對應(yīng)屬性上添 @NotBlank注解,可以實現(xiàn)對空置的限制,本文就來介紹一下java中@NotBlank限制屬性不能為空,感興趣的可以了解一下
    2024-01-01
  • java微信server錄音下載到自己server

    java微信server錄音下載到自己server

    這篇文章主要為大家詳細(xì)介紹了java微信server錄音下載到自己server的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Spring?IOC注入的兩種方式詳解以及代碼示例

    Spring?IOC注入的兩種方式詳解以及代碼示例

    在Spring框架中,依賴注入(Dependency?Injection,DI)是通過控制反轉(zhuǎn)(Inversion?of?Control,IOC)實現(xiàn)的,Spring提供了多種方式來實現(xiàn)IOC注入,本文就給大家介紹兩種注入的方式:基于XML和基于注解,文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-08-08

最新評論