最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Web開發(fā)過程中登陸模塊的驗證碼的實現(xiàn)方式總結

 更新時間:2016年05月25日 15:35:54   作者:死神的喪鐘  
Java的SSH三大Web開發(fā)框架中,對于驗證碼這一基本功能的處理都比較得心應手,接下來我們就來看看整理出的Java Web開發(fā)過程中登陸模塊的驗證碼的實現(xiàn)方式總結:

驗證碼及它的作用
驗證碼為全自動區(qū)分計算機和人類的圖靈測試的縮寫,是一種區(qū)分用戶是計算機的公共全自動程序,這個問題可以由計算機生成并評判,但是必須只有人類才能解答.可以防止惡意破解密碼、刷票、論壇灌水、有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登錄。

圖文驗證碼的原理
在servlet中隨機生成一個指定位置的驗證碼,一般為四位,然后把該驗證碼保存到session中.在通過Java的繪圖類以圖片的形式輸出該驗證碼。為了增加驗證碼的安全級別,可以輸出圖片的同時輸出干擾線,最后在用戶提交數(shù)據(jù)的時候,在服務器端將用戶提交的驗證碼和Session保存的驗證碼進行比較。

實現(xiàn)方式總結
1 驗證碼生成類RandomCode
RandomCode是一個生成驗證碼的工具類,支持英文和數(shù)字驗證碼,驗證碼包括英文大小寫和數(shù)組,其中英文i、o和數(shù)字0、1因為容易產(chǎn)生混淆,不包括在生成驗證碼中。RandomCode支持輸出jpg/bmp/png/gif圖片格式的驗證碼。

/** 
 * RandomCode驗證碼可以通過靜態(tài)方法和實例方法生成。 
 * 
 * 靜態(tài)方法: 
 * 
 * //生成長度為4的隨機驗證碼 
 * String code = RandomCode.randomString(4); 
 * 
 * //把驗證碼圖片輸入到response輸出流中 
 * //圖片格式jpg 
 * OutputStream os = response.getOutputStream(); 
 * RandomCode.write(code, 120, 30, os, "jpg"); 
 * 
 * 實例方法: 
 * 
 * //實例化驗證碼類 
 * RandomCode rc = new RandomCode(4); 
 * 
 * //把驗證碼圖片輸入到response輸出流中 
 * //圖片格式jpg 
 * OutputStream os = response.getOutputStream(); 
 * rc.write(120, 30, os, "jpg"); 
 * 
 * //獲取驗證碼字符串 
 * String code = rc.getCode(); 
 * 
 */ 
public class RandomCode { 
  /** 
   * 隨機驗證碼字符 
   */ 
  private static String base = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789"; 
   
  /** 
   * 隨機驗證碼長度 
   */ 
  private int length = 4; 
   
  /** 
   * 驗證碼字符串 
   */ 
  private String code; 
 
  /** 
   * 4位隨機驗證碼 
   */ 
  public RandomCode(){ 
    this.code = RandomCode.randomString(this.length); 
  } 
   
  public RandomCode(int length){ 
    if(length > 0){ 
      this.length = length; 
    } 
     
    this.code = RandomCode.randomString(this.length); 
  } 
   
  /** 
   * 生成驗證碼圖片 
   * @param width 圖片寬度 
   * @param height 圖片高度 
   * @return 
   */ 
  public BufferedImage toImage(int width, int height){ 
    return RandomCode.toImage(this.code, width, height); 
  } 
   
  /** 
   * 輸出驗證碼圖片,默認圖片格式jpeg 
   * @param width 
   * @param height 
   * @param os 
   * @throws IOException 
   */ 
  public void write(int width, int height, OutputStream os) throws IOException{ 
    RandomCode.write(code, width, height, os, "jpeg"); 
  } 
   
  /** 
   * 輸出驗證碼圖片 
   * @param width 
   * @param height 
   * @param os 
   * @param format 圖片格式,支持jpg/jpeg/bmp/gif/png 
   * @throws IOException 
   */ 
  public void write(int width, int height, OutputStream os, String format) throws IOException{ 
    RandomCode.write(code, width, height, os, format); 
  } 
 
  public int getLength() { 
    return length; 
  } 
   
  public String getCode() { 
    return code; 
  } 
   
  /** 
   * 靜態(tài)方法 
   * 生成隨機字符串 
   * @param length 字符串長度 
   * @return 隨機字符串 
   */ 
  public static String randomString(int length){ 
    Random random = new Random(); 
    StringBuffer sb = new StringBuffer(); 
    for(int i = 0; i < length; i++){ 
      sb.append(base.charAt(random.nextInt(base.length()))); 
    } 
    return sb.toString(); 
  } 
   
  /** 
   * 靜態(tài)方法 
   * 輸出驗證碼圖片 
   * @param code 驗證碼字符串 
   * @param width 圖片寬度 
   * @param height 圖片高度 
   * @param os 圖片輸出流 
   * @param format 圖片格式,支持jpg/jpeg/bmp/gif/png 
   * @throws IOException 
   */ 
  public static void write(String code, int width, int height, OutputStream os, String format) throws IOException{ 
    BufferedImage image = toImage(code, width, height); 
    ImageIO.write(image, format, os); 
  } 
   
  /** 
   * 靜態(tài)方法 
   * 輸出驗證碼圖片,默認圖片格式jpeg 
   * @param code 驗證碼字符串 
   * @param width 圖片寬度 
   * @param height 圖片高度 
   * @param os 圖片輸出流 
   * @throws IOException 
   */ 
  public static void write(String code, int width, int height, OutputStream os) throws IOException{ 
    write(code, width, height, os, "jpeg"); 
  } 
   
  /** 
   * 靜態(tài)方法 
   * 字符串轉(zhuǎn)成驗證碼圖片 
   * @param code 驗證碼字符串 
   * @param width 驗證碼圖片寬度,單位像素 
   * @param height 驗證碼圖片高度,單位像素 
   * @return 
   */ 
  public static BufferedImage toImage(String code, int width, int height){ 
    //字體大小 
    int fontSize = (int)Math.ceil(height * 0.9); 
    if(fontSize < 20){ 
      fontSize = 20; 
    } 
     
    //字體在Y坐標上的位置 
    int positionY = (int)Math.ceil(height * 0.8); 
     
    int lenCode = code.length(); 
     
    //計算字體寬度 
    int fontWidth = width / (lenCode + 2); 
     
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); 
    Graphics g = image.getGraphics(); 
     
    //圖片背景隨機顏色 
    g.setColor(randomColor(new Random(), 200, 250)); 
    g.fillRect(0, 0, width, height); 
     
    //設置字體 
    g.setFont(new Font("Times New Roman", Font.BOLD, fontSize)); 
     
    //在圖片上畫縱橫交錯的線,達到混淆效果 
    drawLines(g, width, height); 
     
    //在圖片上畫驗證碼 
    drawString(g, code, fontWidth, positionY); 
     
    g.dispose(); 
     
    return image; 
  } 
   
  /** 
   * 靜態(tài)方法 
   * 在圖片上話位子 
   * @param g 
   * @param code 驗證碼字符串 
   * @param fontWidth 字體寬度 
   * @param positionY 字體Y坐標 
   */ 
  private static void drawString(Graphics g, String code, int fontWidth, int positionY){ 
    int len = code.length(); 
    Random random = new Random(); 
    for(int i = 0; i < len; i++){ 
      g.setColor(randomColor(random)); 
      g.drawString(String.valueOf(code.charAt(i)), (i + 1) * fontWidth, positionY); 
    } 
  } 
   
  private static Color randomColor(Random random){ 
    int r = random.nextInt(255); 
    int g = random.nextInt(255); 
    int b = random.nextInt(255); 
    return new Color(r, g, b); 
  } 
   
  private static Color randomColor(Random random, int fc, int bc){ 
    if(fc > 255){ 
      fc = 255; 
    } 
       
    if(bc > 255){ 
      bc = 255; 
    }   
     
    int diff = bc-fc; 
    int r = fc + random.nextInt(diff); 
    int g = fc + random.nextInt(diff); 
    int b = fc + random.nextInt(diff); 
    return new Color(r,g,b); 
  } 
   
  /** 
   * 靜態(tài)方法 
   * 畫縱橫交錯的線 
   * @param g 
   * @param width 驗證碼圖片寬度 
   * @param height 驗證碼圖片高度 
   */ 
  private static void drawLines(Graphics g, int width, int height){ 
    Random random = new Random(); 
     
    //線的數(shù)量 
    int count = ((int)(Math.ceil(random.nextDouble() * 100))) + 100;     
     
    for(int i = 0; i < count; i++){ 
      int fc = 160 + (int)Math.ceil(random.nextDouble() * 40); 
      int bc = 200 + (int)Math.ceil(random.nextDouble() * 55); 
      g.setColor(randomColor(random, fc, bc)); 
       
      int x = random.nextInt(width); 
      int y = random.nextInt(height); 
      int xl = random.nextInt(width / 5); 
      int yl = random.nextInt(height / 5);       
      g.drawLine(x, y, x + xl, y + yl); 
    } 
  }   
} 

2 Servlet返回驗證碼
請求路徑http://<網(wǎng)站路徑>/random/code/servlet

@WebServlet("/random/code/servlet") 
public class RandomCodeServlet extends HttpServlet { 
  private static final long serialVersionUID = 1L; 
 
  protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // 驗證碼圖片寬度,單位像素 
    int width = 120; 
    // 驗證碼圖片高度,單位像素 
    int height = 30; 
    // 驗證碼圖片格式 
    String format = "png"; 
    // 驗證碼字符長度 
    int len = 4; 
 
    // 設置圖片格式 
    response.setContentType("image/" + format); 
 
    // 禁止瀏覽器緩存圖片 
    response.setHeader("Pragma", "no-cache"); 
    response.setHeader("Cache-Control", "no-cache"); 
    response.setDateHeader("Expires", 0); 
 
    String code = RandomCode.randomString(len); 
 
    // 把圖片輸出到response輸出流 
    RandomCode.write(code, width, height, response.getOutputStream(), format); 
  } 
} 

3 Strust2返回驗證碼

public class RandomCodeAction extends ActionSupport { 
  private static final long serialVersionUID = -7515645222798283236L; 
 
  /** 
   * 獲取驗證碼 
   */ 
  public void generateCode() { 
    HttpServletResponse response = ServletActionContext.getResponse(); 
 
    // 驗證碼圖片寬度,單位像素 
    int width = 120; 
    // 驗證碼圖片高度,單位像素 
    int height = 30; 
    // 驗證碼圖片格式 
    String format = "png"; 
    // 驗證碼字符長度 
    int len = 4; 
 
    // 設置圖片格式 
    response.setContentType("image/" + format); 
 
    // 禁止瀏覽器緩存圖片 
    response.setHeader("Pragma", "no-cache"); 
    response.setHeader("Cache-Control", "no-cache"); 
    response.setDateHeader("Expires", 0); 
 
    String code = RandomCode.randomString(len); 
 
    // 把圖片輸出到response輸出流 
    try { 
      RandomCode.write(code, width, height, response.getOutputStream(), format); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
} 

Struts2的驗證碼配置

<package name="pkg-random-code" namespace="/" extends="struts-default"> 
  <action name="randomCode_*" method="{1}" class="com.rhui.web.action.RandomCodeAction"></action> 
</package> 

請求路徑http://<網(wǎng)站路徑>/randomCode_generateCode.do

4 SpringMVC返回驗證碼
請求路徑http://<網(wǎng)站路徑>/random/code/generate.do

package com.rhui.web.controller; 
 
import java.io.IOException; 
 
import javax.servlet.http.HttpServletResponse; 
 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
 
import com.rhui.util.RandomCode; 
 
@Controller 
@RequestMapping("/random/code") 
public class RandomCodeController { 
  @RequestMapping("/generate.do") 
  public void generateCode(HttpServletResponse response) { 
    // 驗證碼圖片寬度,單位像素 
    int width = 120; 
    // 驗證碼圖片高度,單位像素 
    int height = 30; 
    // 驗證碼圖片格式 
    String format = "png"; 
    // 驗證碼字符長度 
    int len = 4; 
 
    // 設置圖片格式 
    response.setContentType("image/" + format); 
 
    // 禁止瀏覽器緩存圖片 
    response.setHeader("Pragma", "no-cache"); 
    response.setHeader("Cache-Control", "no-cache"); 
    response.setDateHeader("Expires", 0); 
 
    String code = RandomCode.randomString(len); 
 
    // 把圖片輸出到response輸出流 
    try { 
      RandomCode.write(code, width, height, response.getOutputStream(), format); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
} 

2016525153112542.png (514×123)

相關文章

  • Django基礎知識 URL路由系統(tǒng)詳解

    Django基礎知識 URL路由系統(tǒng)詳解

    這篇文章主要介紹了Django基礎知識 URL路由系統(tǒng)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • python讀取txt數(shù)據(jù)的操作步驟

    python讀取txt數(shù)據(jù)的操作步驟

    這篇文章主要介紹了python讀取txt數(shù)據(jù)的操作步驟,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 解決Python復雜zip文件的解壓問題

    解決Python復雜zip文件的解壓問題

    這篇文章主要介紹了Python復雜zip文件的解壓,通過配合 shutil 與 os 標準庫中的相關功能,實現(xiàn)將指定任意 zip 壓縮包,完好地解壓到指定的目錄中,需要的朋友可以參考下
    2021-12-12
  • python中注釋用法簡單示例

    python中注釋用法簡單示例

    注釋即對程序代碼的解釋,在寫程序時需適當使用注釋,以方便自己和他人理解程序各部分的作用,下面這篇文章主要給大家介紹了關于python中注釋用法的相關資料,需要的朋友可以參考下
    2023-02-02
  • Python分析學校四六級過關情況

    Python分析學校四六級過關情況

    這篇文章主要為大家詳細介紹了利用Python分析學校四六級過關情況,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • python?NetworkX庫生成并繪制帶權無向圖

    python?NetworkX庫生成并繪制帶權無向圖

    這篇文章主要為大家介紹了python?NetworkX庫生成并繪制帶權無向圖的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Python實現(xiàn)1-9數(shù)組形成的結果為100的所有運算式的示例

    Python實現(xiàn)1-9數(shù)組形成的結果為100的所有運算式的示例

    下面小編就為大家?guī)硪黄狿ython實現(xiàn)1-9數(shù)組形成的結果為100的所有運算式的示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Mac下PyCharm快捷鍵分享

    Mac下PyCharm快捷鍵分享

    這篇文章主要介紹了Mac下PyCharm快捷鍵,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • python線程join方法原理解析

    python線程join方法原理解析

    這篇文章主要介紹了python線程join方法原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • 在django模板中實現(xiàn)超鏈接配置

    在django模板中實現(xiàn)超鏈接配置

    今天小編就為大家分享一篇在django模板中實現(xiàn)超鏈接配置,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08

最新評論

河南省| 清徐县| 盐山县| 哈密市| 遂溪县| 平度市| 潞城市| 保靖县| 公安县| 鹤岗市| 多伦县| 武清区| 台湾省| 迭部县| 祁连县| 七台河市| 龙门县| 潜江市| 桂东县| 青海省| 扎赉特旗| 甘孜县| 个旧市| 依兰县| 红安县| 巴林左旗| 犍为县| 荥阳市| 湄潭县| 富顺县| 湖州市| 黄梅县| 共和县| 山东省| 双江| 界首市| 淅川县| 班戈县| 绥江县| 县级市| 漳平市|