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); 

提交表单常用的验证 readOnly:字段是否只读,默认为false maxLength:字段允许输入的最大长度 minLength:字段允许输入的最小长度 vtype:验证类型的名字 alpha:限制只能输入字母 alphanum:限制只能输入字母和数字 email:验证email格式 url:验证url格式 editable:下拉框是否可编辑,默认为true disabled:控件是否可用,默认为false regex:正则表达式 匹配特定数字: ^[1-9]\d*$    //匹配正整数 ^-[1-9]\d*$   //匹配负整数 ^-?[1-9]\d*$   //匹配整数 ^[1-9]\d* ¦0$  //匹配非负整数(正整数 + 0) ^-[1-9]\d* ¦0$   //匹配非正整数(负整数 + 0) ^[1-9]\d*\.\d* ¦0\.\d*[1-9]\d*$   //匹配正浮点数 ^-([1-9]\d*\.\d* ¦0\.\d*[1-9]\d*)$  //匹配负浮点数 ^-?([1-9]\d*\.\d* ¦0\.\d*[1-9]\d* ¦0?\.0+ ¦0)$  //匹配浮点数 匹配特定字符串: ^[A-Za-z]+$  //匹配由26个英文字母组成的字符串 ^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串 ^[a-z]+$  //匹配由26个英文字母的小写组成的字符串 ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串 ^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串 常用验证: /n[/s|]*/r //匹配空行的正则表达式 匹配空行的正则表达式\d{15} ¦\d{18} //身份证验证 15或18位 [1-9]\d{5}(?!\d) //邮政编码 6位 ^[a-zA-z]+://[^\s]*  //url [\u4e00-\u9fa5] //匹配中文字符 ^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$    //email地址 \d{3}-\d{8} ¦\d{4}-\d{7} //电话号码验证,如:0511-4405222 或 021-87888822
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值