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

java后臺(tái)驗(yàn)證碼生成的實(shí)現(xiàn)方法

 更新時(shí)間:2021年05月14日 10:48:26   作者:LonlySnow  
在我們使用進(jìn)行系統(tǒng)開發(fā)時(shí),為了提高系統(tǒng)的安全性,在登錄的時(shí)候多數(shù)人都會(huì)要求輸入驗(yàn)證,本文介紹了java后臺(tái)驗(yàn)證碼生成的實(shí)現(xiàn)方法,感興趣的一起來(lái)了解一下

效果圖如下:

1.適用需求

后臺(tái)生成驗(yàn)證碼,用于登陸驗(yàn)證。

2. 功能實(shí)現(xiàn)所需控件/文件:

無(wú)(普通標(biāo)簽)

3.功能點(diǎn)實(shí)現(xiàn)思路

1)前臺(tái)思路:

(1)前臺(tái)一個(gè)<input>用于輸入驗(yàn)證碼;一個(gè)<img>用于展示驗(yàn)證碼。

(2)驗(yàn)證碼生成以及展示,點(diǎn)擊刷新功能,可以為<img>綁定click事件。

(3)click事件里面寫ajax請(qǐng)求,通過后臺(tái)生成處理好的帶噪點(diǎn)的驗(yàn)證碼圖片。

注意:后臺(tái)直接返回圖片,不是驗(yàn)證碼的字符!若返回字符,則驗(yàn)證碼就失去了意義(前臺(tái)很容易就可以獲取驗(yàn)證碼字符,進(jìn)行多次惡意訪問了)(這點(diǎn)考慮了系統(tǒng)安全性)

(4)關(guān)于返回的圖片如何在<img>標(biāo)簽內(nèi)展示

直接利用img的src屬性,屬性值為后臺(tái)生成驗(yàn)證碼的方法請(qǐng)求路徑即可。當(dāng)點(diǎn)擊驗(yàn)證碼的時(shí)候,再動(dòng)態(tài)設(shè)置src屬性即可(原訪問地址+隨機(jī)時(shí)間戳,防止同一路徑瀏覽器不另作訪問的問題)

前臺(tái)部分代碼:

/*驗(yàn)證碼輸入框*/
 
<input class="verifyInput"  name="verifyInput" placeholder="請(qǐng)輸入驗(yàn)證碼">   
 
 
/*驗(yàn)證碼圖片*/
 
<img class="verifyCode" onclick="changeCode()" src="getVerifyCode">
 
//src的getVerifyCode是后臺(tái)訪問地址;項(xiàng)目為SSM框架。
 
 
/*點(diǎn)擊刷新驗(yàn)證碼*/
 
function changeCode(){
 
         var src = " getVerifyCode?"+new Date().getTime(); //加時(shí)間戳,防止瀏覽器利用緩存
 
    $('.verifyCode').attr("src",src);                  //jQuery寫法
 
}

2)后臺(tái)思路:

后臺(tái)思路很簡(jiǎn)單,利用BufferedImage類創(chuàng)建一張圖片,再用Graphics2D對(duì)圖片進(jìn)行繪制(生成隨機(jī)字符,添加噪點(diǎn),干擾線)即可。注意生成的驗(yàn)證碼字符串要放到session中,用于接下來(lái)登陸的驗(yàn)證碼驗(yàn)證(當(dāng)然也是后臺(tái))。

部分代碼如下:

/* 獲取驗(yàn)證碼圖片*/
 
         @RequestMapping("/getVerifyCode ")
 
         public void getVerificationCode(HttpServletResponse response,HttpServletRequest request) {
 
                   try {
 
                            int width=200;
 
                            int height=69;
 
         BufferedImage verifyImg=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
 
//生成對(duì)應(yīng)寬高的初始圖片
 
                            String randomText = VerifyCode.drawRandomText(width,height,verifyImg);
 
//單獨(dú)的一個(gè)類方法,出于代碼復(fù)用考慮,進(jìn)行了封裝。
 
//功能是生成驗(yàn)證碼字符并加上噪點(diǎn),干擾線,返回值為驗(yàn)證碼字符                   
 
request.getSession().setAttribute("verifyCode", randomText);
 
                   response.setContentType("image/png");//必須設(shè)置響應(yīng)內(nèi)容類型為圖片,否則前臺(tái)不識(shí)別
 
                 OutputStream os = response.getOutputStream(); //獲取文件輸出流    
 
                 ImageIO.write(verifyImg,"png",os);//輸出圖片流
 
                 os.flush();
 
                 os.close();//關(guān)閉流
 
                   } catch (IOException e) {
 
                            this.logger.error(e.getMessage());
 
                            e.printStackTrace();
 
                   }
 
         }
/*對(duì)圖片進(jìn)行處理的類和方法*/
 
public class VerifyCode {  
 
    public static  String drawRandomText(int width,int height,BufferedImage verifyImg) {
             Graphics2D graphics = (Graphics2D)verifyImg.getGraphics();
             graphics.setColor(Color.WHITE);//設(shè)置畫筆顏色-驗(yàn)證碼背景色
             graphics.fillRect(0, 0, width, height);//填充背景
        graphics.setFont(new Font("微軟雅黑", Font.BOLD, 40));
        //數(shù)字和字母的組合
String baseNumLetter= = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";
 
        StringBuffer sBuffer = new StringBuffer();
        int x = 10;  //旋轉(zhuǎn)原點(diǎn)的 x 坐標(biāo)
        String ch = "";
        Random random = new Random();
        for(int i = 0;i < 4;i++){
                 graphics.setColor(getRandomColor());
            //設(shè)置字體旋轉(zhuǎn)角度
            int degree = random.nextInt() % 30;  //角度小于30度
            int dot = random.nextInt(baseNumLetter.length());
            ch = baseNumLetter.charAt(dot) + "";
            sBuffer.append(ch);
            //正向旋轉(zhuǎn)
            graphics.rotate(degree * Math.PI / 180, x, 45);
            graphics.drawString(ch, x, 45);
            //反向旋轉(zhuǎn)
            graphics.rotate(-degree * Math.PI / 180, x, 45);
            x += 48;
        }
        //畫干擾線
        for (int i = 0; i <6; i++) {
            // 設(shè)置隨機(jī)顏色
                 graphics.setColor(getRandomColor());
            // 隨機(jī)畫線
                 graphics.drawLine(random.nextInt(width), random.nextInt(height),
                                    random.nextInt(width), random.nextInt(height));
        }
        //添加噪點(diǎn)
        for(int i=0;i<30;i++){
                 int x1 = random.nextInt(width);
                 int y1 = random.nextInt(height);
                 graphics.setColor(getRandomColor());
                 graphics.fillRect(x1, y1, 2,2);
                 }
        return sBuffer.toString();
    }
    /**
     * 隨機(jī)取色
 
     */
    private static Color getRandomColor() {
        Random ran = new Random();
        Color color = new Color(ran.nextInt(256),
                ran.nextInt(256), ran.nextInt(256));
        return color;
    }
}

4.功能實(shí)現(xiàn)心得:

驗(yàn)證碼的功能實(shí)現(xiàn)思路很簡(jiǎn)單,從系統(tǒng)安全性和代碼復(fù)用性這兩點(diǎn)考慮,驗(yàn)證碼必須后臺(tái)生成,生成驗(yàn)證碼的方法可以封裝到靜態(tài)工具類里。此外,后臺(tái)用到許多Java自帶的圖片處理類值得學(xué)習(xí)。

 到此這篇關(guān)于java后臺(tái)驗(yàn)證碼生成的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)java 驗(yàn)證碼生成內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Java實(shí)現(xiàn)圖片相似度對(duì)比的示例代碼

    基于Java實(shí)現(xiàn)圖片相似度對(duì)比的示例代碼

    很多時(shí)候我們需要將兩個(gè)圖片進(jìn)行對(duì)比,確定兩個(gè)圖片的相似度。本文將利用Java和OpenCV庫(kù)實(shí)現(xiàn)圖片相似度對(duì)比,感興趣的可以動(dòng)手嘗試一下
    2022-07-07
  • Java中超詳細(xì)this與super的概念和用法

    Java中超詳細(xì)this與super的概念和用法

    這篇文章主要介紹了Java中超詳細(xì)this與super的概念和用法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • springboot3整合knife4j詳細(xì)圖文教程(swagger增強(qiáng))

    springboot3整合knife4j詳細(xì)圖文教程(swagger增強(qiáng))

    開發(fā)api提供對(duì)應(yīng)的接口規(guī)范進(jìn)行聯(lián)調(diào)或并行開發(fā),api文檔管理必不可少,常用的Knife4j基于swagger(依賴已經(jīng)compile),可以進(jìn)行管理,下面這篇文章主要給大家介紹了關(guān)于springboot3整合knife4j的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • SpringSecurity微服務(wù)實(shí)戰(zhàn)之公共模塊詳解

    SpringSecurity微服務(wù)實(shí)戰(zhàn)之公共模塊詳解

    這篇文章主要為大家介紹了SpringSecurity微服務(wù)實(shí)戰(zhàn)之公共模塊詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Java解析JSON數(shù)據(jù)時(shí)報(bào)錯(cuò)問題解決方案

    Java解析JSON數(shù)據(jù)時(shí)報(bào)錯(cuò)問題解決方案

    這篇文章主要介紹了Java解析JSON數(shù)據(jù)時(shí)報(bào)錯(cuò)問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java實(shí)現(xiàn)SM3withSM2簽名和驗(yàn)證的基本示例

    Java實(shí)現(xiàn)SM3withSM2簽名和驗(yàn)證的基本示例

    這篇文章主要介紹了Java實(shí)現(xiàn)SM3withSM2簽名和驗(yàn)證的基本示例,SM3withSM2是一種在Java中使用的密碼學(xué)算法組合,結(jié)合了橢圓曲線公鑰密碼算法SM2和密碼哈希算法SM3,它主要用于數(shù)字簽名和數(shù)據(jù)完整性校驗(yàn),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Java File類 mkdir 不能創(chuàng)建多層目錄的解決

    Java File類 mkdir 不能創(chuàng)建多層目錄的解決

    這篇文章主要介紹了Java File類 mkdir 不能創(chuàng)建多層目錄的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring基于ProxyFactoryBean創(chuàng)建AOP代理

    Spring基于ProxyFactoryBean創(chuàng)建AOP代理

    這篇文章主要介紹了Spring基于ProxyFactoryBean創(chuàng)建AOP代理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 基于java時(shí)區(qū)轉(zhuǎn)換夏令時(shí)的問題及解決方法

    基于java時(shí)區(qū)轉(zhuǎn)換夏令時(shí)的問題及解決方法

    下面小編就為大家分享一篇基于java時(shí)區(qū)轉(zhuǎn)換夏令時(shí)的問題及解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2017-11-11
  • intellij idea設(shè)置統(tǒng)一JavaDoc模板的方法詳解

    intellij idea設(shè)置統(tǒng)一JavaDoc模板的方法詳解

    這篇文章主要介紹了intellij idea設(shè)置統(tǒng)一JavaDoc模板的方法詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04

最新評(píng)論

老河口市| 张掖市| 北安市| 梁河县| 桓仁| 灵丘县| 原平市| 上饶县| 泸溪县| 武功县| 富平县| 扶沟县| 云和县| 牙克石市| 阿克陶县| 白朗县| 沁阳市| 宁安市| 宾阳县| 安远县| 化隆| 永宁县| 普洱| 崇州市| 南岸区| 吴川市| 嵊泗县| 文登市| 东莞市| 昆明市| 文登市| 巫山县| 饶河县| 博野县| 弥渡县| 惠来县| 靖宇县| 上蔡县| 油尖旺区| 宝丰县| 邯郸县|