成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[翻譯]Play框架1.2.7版本教程(5) - 設(shè)置驗證碼

姘存按 / 1979人閱讀

摘要:設(shè)置驗證碼任何人都可以在我們的博客下發(fā)布評論,所以我們需要避免非人類用戶來擾亂秩序。一個簡單的防范方法是設(shè)置驗證碼。然后我們修改表單來顯示驗證碼,并把寫入隱藏的域里面。檢查驗證碼功能是否完成了。

設(shè)置驗證碼

任何人都可以在我們的博客下發(fā)布評論,所以我們需要避免非人類用戶來擾亂秩序。一個簡單的防范方法是設(shè)置驗證碼。

生成驗證碼

如何利用Play框架來生成驗證碼?簡單來說,我們需要增加一個action,不過讓它返回的是一個二進(jìn)制的對象而不是之前的HTML頁面。

因為Play是一個全棧式框架,我們試圖在框架內(nèi)部內(nèi)置了Web應(yīng)用通常所需的東西;其中就包括生成驗證碼。我們可以使用play.libs.Images來簡單地生成驗證碼,然后通過HTTP響應(yīng)返回它。

如常,我們先從一個原型開始。在Applicantion控制器中添加captcha action。

public static void captcha() {
    Images.Captcha captcha = Images.captcha();
    renderBinary(captcha);
}

注意我們可以直接傳遞captcha對象給renderBinary(),因為Images.Captcha類實現(xiàn)了java.io.InputStream。

  

請勿忘記導(dǎo)入play.lib.*

現(xiàn)在向/yabe/conf/routes添加新路由:

GET     /captcha                                Application.captcha

然后打開http://localhost:9000/captcha看看效果。

每次刷新時應(yīng)該會產(chǎn)生隨機(jī)的文字

我們怎樣管理狀態(tài)?

目前為止事情順利,但是最復(fù)雜的部分就要來了。要想驗證驗證碼,我們需要保存驗證碼圖片上的文字,然后跟提交的表單進(jìn)行比對。

當(dāng)然我們可以把文字存儲在用戶會話中,然后在驗證時再提取出來。但這樣做有兩個問題:

首先,Play的會話是存儲在cookie里的。這樣解決了一些架構(gòu)上的問題,但是也引入一些麻煩。寫入到cookie的數(shù)據(jù)是簽了名的,這樣用戶就不能修改它;但是它并未加密。如果我們把驗證碼的內(nèi)容寫入cookie,每個人都可以讀到它 —— 然后破解它。

其次,不要忘了Play是一個無狀態(tài)的框架。我們想要在無狀態(tài)的情況下管理事務(wù)。假如一個用戶同時打開兩個不同的博客頁面,生成了不同的驗證碼,我們就需要跟蹤處理對應(yīng)的驗證碼。

所以要想解決問題,我們需要兩樣?xùn)|西。我們得在服務(wù)器存儲驗證碼的密鑰。因為它是一個臨時數(shù)據(jù),我們可以存儲在Play緩存(Cache)中。此外,這樣做還可以增加安全性,因為存儲在緩存中的數(shù)據(jù)的生命期是有限的(比如10分鐘)。然后我們還需要生成獨(dú)一無二的ID。這個ID將添加到每個表單的隱藏域中,對應(yīng)著一個生成的驗證碼。

下面讓我們來解決這個問題吧。

修改captcha action成這樣:

public static void captcha(String id) {
    Images.Captcha captcha = Images.captcha();
    String code = captcha.getText("#E4EAFD");
    Cache.set(id, code, "10mn");
    renderBinary(captcha);
}

注意getText()方法接受任意顏色作為參數(shù)。它需要輸入的顏色來畫文本。

  

請勿忘記導(dǎo)入play.cache.*。

添加驗證碼到評論框

現(xiàn)在,在顯示一個評論框之前我們先生成一個獨(dú)一無二的ID。然后我們修改HTML表單來顯示驗證碼,并把ID寫入隱藏的域里面。

讓我們重寫Application.show action:

public static void show(Long id) {
    Post post = Post.findById(id);
    String randomID = Codec.UUID();
    render(post, randomID);
}

以及/yable/app/views/Application/show.html模板中的表單:


好棒,現(xiàn)在評論框里能看到驗證碼了。

驗證驗證碼

現(xiàn)在來驗證驗證碼吧。我們添加了randomID作為隱藏域?qū)Π??那就?b>postComment里面把它提取出來,然后取出緩存中對應(yīng)的編碼,最后跟提交的輸入進(jìn)行比對。

這一點(diǎn)都不難。讓我們來修改postComment方法。

public static void postComment(
        Long postId, 
        @Required(message="Author is required") String author, 
        @Required(message="A message is required") String content, 
        @Required(message="Please type the code") String code, 
        String randomID) 
{
    Post post = Post.findById(postId);
    validation.equals(
        code, Cache.get(randomID)
    ).message("Invalid code. Please type it again");
    if(validation.hasErrors()) {
        render("Application/show.html", post, randomID);
    }
    post.addComment(author, content);
    flash.success("Thanks for posting %s", author);
    Cache.delete(randomID);
    show(postId);
}

因為現(xiàn)在有不同的錯誤信息,而我們只想顯示第一條信息,所以修改show.html模板中顯示錯誤的部分:

.. 
#{ifErrors}
    

${errors[0]}

#{/ifErrors} …
  

對于一個更加復(fù)雜的表單,錯誤信息不應(yīng)該這樣管理,而應(yīng)該集中到一個訊息文件中,并且每個錯誤都應(yīng)該在對應(yīng)的區(qū)域內(nèi)顯示。

檢查驗證碼功能是否完成了。

耶!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64100.html

相關(guān)文章

  • [翻譯]Play框架1.2.7版本教程(10) - 完成應(yīng)用測試

    摘要:完成應(yīng)用測試我們已經(jīng)完成了我們想要創(chuàng)建的博客引擎。當(dāng)然我們已經(jīng)完成了測試所有模型層的功能。評估代碼覆蓋率當(dāng)然我們還沒有完成應(yīng)用所需的所有測試用例。如你所見,我們遠(yuǎn)遠(yuǎn)沒有完成對應(yīng)用的全面測試。 完成應(yīng)用測試 我們已經(jīng)完成了我們想要創(chuàng)建的博客引擎。不過這個項目尚未完全結(jié)束。為了保證代碼的質(zhì)量,我們需要添加更多的測試。 當(dāng)然我們已經(jīng)完成了測試所有模型層的功能。所以博客引擎的核心功能已經(jīng)被...

    _Dreams 評論0 收藏0
  • [翻譯]Play框架1.2.7版本教程(1)

    摘要:確保你的文本編輯器已經(jīng)做了相應(yīng)的配置。第一個,會自動監(jiān)測源代碼的改變并在運(yùn)行時自動重載。檢查下面的一行是否出現(xiàn)在應(yīng)用日志中使用版本控制系統(tǒng)來追蹤變化當(dāng)你開發(fā)一個項目時,最好使用版本控制系統(tǒng)來存儲你的源代碼。 Play是一個Java Web敏捷開發(fā)的框架http://www.playframework.com/documentation/1.2.7/home 之所以要翻譯這個教程,是因...

    solocoder 評論0 收藏0
  • [翻譯]Play框架1.2.7版本教程(4) - 瀏覽和提交評論

    摘要:瀏覽和提交評論博客主頁現(xiàn)在已經(jīng)完成,接下來要完成博客正文頁面。整個頁面將展示當(dāng)前文章的所有評論,還包括一個用于提交新的評論的表單。刷新瀏覽器,檢查這次是否使用了正確的。給模板添加表單在后面試下提交新的評論。 瀏覽和提交評論 博客主頁現(xiàn)在已經(jīng)完成,接下來要完成博客正文頁面。整個頁面將展示當(dāng)前文章的所有評論,還包括一個用于提交新的評論的表單。 創(chuàng)建show action 要顯示文章內(nèi)...

    AWang 評論0 收藏0
  • [翻譯]Play框架1.2.7版本教程(8) - 添加驗證

    摘要:添加驗證既然我們有一個管理面板,自然需要進(jìn)行驗證。自定義驗證過程你可以用應(yīng)用提供的實例來自定義驗證過程。通過繼承自該類,我們可以指定驗證用戶的方式。這個將給每個作者發(fā)布自己的文章的權(quán)限?,F(xiàn)在在添加到控制器的鏈接接下來是創(chuàng)建模板。 添加驗證 既然我們有一個管理面板,自然需要進(jìn)行驗證。幸運(yùn)的是,Play已經(jīng)提供了一個叫做Secure的模塊來幫助我們。 啟動Secure模塊 在yabe/co...

    My_Oh_My 評論0 收藏0
  • [翻譯]Play框架1.2.7版本教程(7) - 通過CRUD來實現(xiàn)一個基本的管理面板

    摘要:通過來實現(xiàn)一個基本的管理面板目前,我們還沒法使用博客的來寫新的文章,或修改評論。提供了一個即開即用的模塊,可以快速生成一個基本的管理面板。這是因為默認(rèn)是以的輸出來得到一個模型對象的表示。在本教程的最后一章,你會學(xué)到關(guān)于本地化信息的更多東西。 通過CRUD來實現(xiàn)一個基本的管理面板 目前,我們還沒法使用博客的UI來寫新的文章,或修改評論。Play提供了一個即開即用的CRUD模塊,可以快速...

    騫諱護(hù) 評論0 收藏0

發(fā)表評論

0條評論

姘存按

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<