4、表单提交和验证
1、啟用/禁用表單module
sbt啟動應用時默認就啟用了表單,也可以在build.sbt中添加啟用libraryDependencies += javaForms,想要移除表單時使用PlayMinimalJava 插件
2、play接收表單數據
play.data中的類可用于處理HTTP表單數據提交和驗證,操作提交的表單可以使用play.data.Form類如果想將獲取到的表單數據直接封裝到對應的實體,則實體字段需要和表單字段對應,并且需要實現get、set方法;也可以不實現get、set方法,直接在conf/application.conf文件中進行配置play.forms.binding.directFieldAccess = true 即可,在這種情況下,如果在form綁定期間無法訪問字段play將嘗試通過內部調用field.setaccessible(true)反射訪問字段,容易造成錯誤。也可以通過調用方法對指定的類型進行直接綁定。
具體說一下代碼實現,需要先注入play.data.FormFactory到操作表單的對應控制器中,之后可以調用方法form來進行綁定,例如
:
這里的User類中需要聲明對應的get、set方法,下邊介紹一個方法,使得綁定的實體不需要聲明get、set方法,如下:
Play的這種綁定機制其底層依賴的是spring data
接下來就是從form中獲取值,可以使用bind、get方法獲取對應的值,最后說一下,可以通過formFactory.form().bindFromRequest()的方式獲取到一個動態表單對象DynamicForm,可以通過DynamicForm中的data方法,直接將表單數據封裝到Map集合中。
可以綁定默認值,操作如下:
可以獲取到一個動態表單,直接獲取字段:
3、表單數據校驗
Play內置的驗證方式使用的是hibernate的驗證方式,可以使用JSR-380注解對將進行綁定的數據進行約束,使用如下:
綁定失敗時的處理:
還有一些高級的校驗,無非就是用注解,自我感覺沒什么意思,在這里不做說明,如有需要,可查看官方文檔
4、 注冊自定義數據綁定器
當表單中的數據映射到對象時,想要格式化數據的格式,這個時候就可以使用自定義數據綁定器來實現,實現數據綁定器需要三步:
1、編寫一個數據格式化的類,這個類實現Provider<Formatters>接口
2、綁定這個用于格式化數據的類
3、啟用這個組件,注銷默認組件
5、模板中使用Form
Play提供了幫助器用來實現在HTML模板中呈現表單。接下來詳細介紹:
生成標簽時使用 @helper開頭,設置值時使用@ 開頭,直接使用即可,上邊這種一般開發不會這么用,太費勁
6、防止跨站點請求(CSRF)偽造
跨站點請求偽造(CSRF)是一種安全漏洞,攻擊者利用該漏洞誘使受害者的瀏覽器使用受害者的會話發出請求。由于會話令牌隨每個請求一起發送,如果攻擊者可以強制受害者的瀏覽器代表他們發出請求,則攻擊者可以代表用戶發出請求。
當滿足請求方法不是get、head或options、請求有一個或多個cookie或授權頭、CORS過濾器沒有配置為信任請求的來源這三個條件是,play框架會對請求做CSRF校驗。
Play支持多種方法來驗證請求是否不是CSRF請求。主要機制是CSRF令牌。這個令牌被放置在提交的每個表單的查詢字符串或主體中,也被放置在用戶會話中。然后play驗證兩個令牌是否存在并匹配。對于非瀏覽器請求,play僅對帶有cookie的請求檢查。如果使用Ajax進行請求,可以將CSRF令牌放在HTML頁面中,然后使用CSRF令牌頭將其添加到請求中。也可以設置play.filters.csrf.header.bypassHeaders 以匹配公共頭,如果請求頭帶有x-requested-with,則play將認為請求是安全的。x-requested-with被許多流行的javascript庫添加到請求中。如果存在值為nocheck的csrf令牌頭,或者具有有效的csrf令牌,則play將認為請求是安全的。如下:
默認情況下,如果在CSRF過濾器之前有一個CORS過濾器,那么CSRF過濾器將允許來自可信來源的CORS請求。要禁用此檢查,請設置配置選項play.filters.csrf.bypasscorstrustedorigins=false。
自2.6開始,CSRF過濾器包含在play的默認過濾器列表中,這些默認過濾器將自動應用于項目??梢耘渲靡粋€全局的CSRF過濾器,可以應用于所有請求,在application.conf進行配置,如下:
play.filters.enabled += "play.filters.csrf.CSRFFilter"
有時候有的請求不希望跨域,可以在路由文件中禁用特定路由的CSRF篩選器。在路由之前添加nocsrf修改器標記:
csrf.gettoken方法訪問當前的csrf令牌:
為了在form中添加csrf令牌,play提供了兩種方式:
第一種是顯式的:
第二種是隱式的:
為確保CSRF令牌可在表單中呈現并發送回客戶端,如果傳入請求中沒有令牌,則全局CSRF過濾器將為所有GET請求生成一個新令牌。
如果不想對所有的請求進行CSRF過濾,只對默寫特定的請求進行過濾,則可以使用play提供的兩個組合動作: play.filters.csrf.RequireCSRFCheck和 play.filters.csrf.AddCSRFToken,使用時就像之前使用組合動作的注解一樣:
CSRF的一些配置參數可以在?reference.conf?文件中查看
測試CSRF:
Http.RequestBuilder request = new
Http.RequestBuilder().method(POST).uri("/xx/Kiwi");
request = CSRFTokenHelper.addCSRFToken(request);?
總結
- 上一篇: 电脑配置单2022(电脑配置单2017)
- 下一篇: 5、play中的json数据处理