摘要:設置驗證碼任何人都可以在我們的博客下發布評論,所以我們需要避免非人類用戶來擾亂秩序。一個簡單的防范方法是設置驗證碼。然后我們修改表單來顯示驗證碼,并把寫入隱藏的域里面。檢查驗證碼功能是否完成了。
設置驗證碼
任何人都可以在我們的博客下發布評論,所以我們需要避免非人類用戶來擾亂秩序。一個簡單的防范方法是設置驗證碼。
生成驗證碼如何利用Play框架來生成驗證碼?簡單來說,我們需要增加一個action,不過讓它返回的是一個二進制的對象而不是之前的HTML頁面。
因為Play是一個全棧式框架,我們試圖在框架內部內置了Web應用通常所需的東西;其中就包括生成驗證碼。我們可以使用play.libs.Images來簡單地生成驗證碼,然后通過HTTP響應返回它。
如常,我們先從一個原型開始。在Applicantion控制器中添加captcha action。
public static void captcha() { Images.Captcha captcha = Images.captcha(); renderBinary(captcha); }
注意我們可以直接傳遞captcha對象給renderBinary(),因為Images.Captcha類實現了java.io.InputStream。
請勿忘記導入play.lib.*
現在向/yabe/conf/routes添加新路由:
GET /captcha Application.captcha
然后打開http://localhost:9000/captcha看看效果。
每次刷新時應該會產生隨機的文字
我們怎樣管理狀態?目前為止事情順利,但是最復雜的部分就要來了。要想驗證驗證碼,我們需要保存驗證碼圖片上的文字,然后跟提交的表單進行比對。
當然我們可以把文字存儲在用戶會話中,然后在驗證時再提取出來。但這樣做有兩個問題:
首先,Play的會話是存儲在cookie里的。這樣解決了一些架構上的問題,但是也引入一些麻煩。寫入到cookie的數據是簽了名的,這樣用戶就不能修改它;但是它并未加密。如果我們把驗證碼的內容寫入cookie,每個人都可以讀到它 —— 然后破解它。
其次,不要忘了Play是一個無狀態的框架。我們想要在無狀態的情況下管理事務。假如一個用戶同時打開兩個不同的博客頁面,生成了不同的驗證碼,我們就需要跟蹤處理對應的驗證碼。
所以要想解決問題,我們需要兩樣東西。我們得在服務器存儲驗證碼的密鑰。因為它是一個臨時數據,我們可以存儲在Play緩存(Cache)中。此外,這樣做還可以增加安全性,因為存儲在緩存中的數據的生命期是有限的(比如10分鐘)。然后我們還需要生成獨一無二的ID。這個ID將添加到每個表單的隱藏域中,對應著一個生成的驗證碼。
下面讓我們來解決這個問題吧。
修改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()方法接受任意顏色作為參數。它需要輸入的顏色來畫文本。
添加驗證碼到評論框請勿忘記導入play.cache.*。
現在,在顯示一個評論框之前我們先生成一個獨一無二的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模板中的表單:
…
…
好棒,現在評論框里能看到驗證碼了。
驗證驗證碼現在來驗證驗證碼吧。我們添加了randomID作為隱藏域對吧?那就在postComment里面把它提取出來,然后取出緩存中對應的編碼,最后跟提交的輸入進行比對。
這一點都不難。讓我們來修改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); }
因為現在有不同的錯誤信息,而我們只想顯示第一條信息,所以修改show.html模板中顯示錯誤的部分:
.. #{ifErrors}${errors[0]}
#{/ifErrors} …
對于一個更加復雜的表單,錯誤信息不應該這樣管理,而應該集中到一個訊息文件中,并且每個錯誤都應該在對應的區域內顯示。
檢查驗證碼功能是否完成了。
耶!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64100.html
摘要:完成應用測試我們已經完成了我們想要創建的博客引擎。當然我們已經完成了測試所有模型層的功能。評估代碼覆蓋率當然我們還沒有完成應用所需的所有測試用例。如你所見,我們遠遠沒有完成對應用的全面測試。 完成應用測試 我們已經完成了我們想要創建的博客引擎。不過這個項目尚未完全結束。為了保證代碼的質量,我們需要添加更多的測試。 當然我們已經完成了測試所有模型層的功能。所以博客引擎的核心功能已經被...
摘要:確保你的文本編輯器已經做了相應的配置。第一個,會自動監測源代碼的改變并在運行時自動重載。檢查下面的一行是否出現在應用日志中使用版本控制系統來追蹤變化當你開發一個項目時,最好使用版本控制系統來存儲你的源代碼。 Play是一個Java Web敏捷開發的框架http://www.playframework.com/documentation/1.2.7/home 之所以要翻譯這個教程,是因...
摘要:瀏覽和提交評論博客主頁現在已經完成,接下來要完成博客正文頁面。整個頁面將展示當前文章的所有評論,還包括一個用于提交新的評論的表單。刷新瀏覽器,檢查這次是否使用了正確的。給模板添加表單在后面試下提交新的評論。 瀏覽和提交評論 博客主頁現在已經完成,接下來要完成博客正文頁面。整個頁面將展示當前文章的所有評論,還包括一個用于提交新的評論的表單。 創建show action 要顯示文章內...
摘要:添加驗證既然我們有一個管理面板,自然需要進行驗證。自定義驗證過程你可以用應用提供的實例來自定義驗證過程。通過繼承自該類,我們可以指定驗證用戶的方式。這個將給每個作者發布自己的文章的權限?,F在在添加到控制器的鏈接接下來是創建模板。 添加驗證 既然我們有一個管理面板,自然需要進行驗證。幸運的是,Play已經提供了一個叫做Secure的模塊來幫助我們。 啟動Secure模塊 在yabe/co...
摘要:通過來實現一個基本的管理面板目前,我們還沒法使用博客的來寫新的文章,或修改評論。提供了一個即開即用的模塊,可以快速生成一個基本的管理面板。這是因為默認是以的輸出來得到一個模型對象的表示。在本教程的最后一章,你會學到關于本地化信息的更多東西。 通過CRUD來實現一個基本的管理面板 目前,我們還沒法使用博客的UI來寫新的文章,或修改評論。Play提供了一個即開即用的CRUD模塊,可以快速...
閱讀 2568·2023-04-25 17:33
閱讀 648·2021-11-23 09:51
閱讀 2951·2021-07-30 15:32
閱讀 1395·2019-08-29 18:40
閱讀 1940·2019-08-28 18:19
閱讀 1465·2019-08-26 13:48
閱讀 2237·2019-08-23 16:48
閱讀 2275·2019-08-23 15:56