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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【贪心】最佳浏览路线问题

最佳浏览路线问题最佳浏览路线问题最佳浏览路线问题 题目描述 某旅游区的街道成网格状&#xff08;见图&#xff09;&#xff0c;其中东西向的街道都是旅游街&#xff0c;南北向的街道都是林荫道。由于游客众多&#xff0c;旅游街被规定为单行道。游客在旅游街上只能从西向东…

Ooui:在浏览器中运行.NET应用

在过去数年中&#xff0c;桌面应用开发人员一直处境艰难&#xff0c;因为人们的主要关注点聚焦于Web和移动应用。由于Microsoft未来Windows平台的计划未定&#xff0c;并且UWP应用也没有突破性进展&#xff0c;因此技术落伍的责任也不应由.NET开发人员来承担。当前迫切需要解决…

5、play中的json数据处理

1、play中的json库 Play使用Jackson JSON库将对象转换为JSON和JSON之间的对象。play的操作使用JsonNode类型&#xff0c;play.libs.json包中有操作json数据的方法 2、java对象和json数据 将java对象转成play中的JsonNode类型&#xff1a; 将JsonNode格式的数据解析到java对象…

农行基于TFS工具的敏捷转型实践

““春天工程”项目组是应用开发二部最早采用敏捷模式的项目组&#xff0c;项目组在项目推进过程中使用Scrum框架&#xff0c;结合“看板站会”形式&#xff0c;积极探索项目推进新措施。结合TFS工具逐步实现了电子工具与物理看板的有机融合&#xff0c;并在过程管理、版本管理…

6、XML数据处理

1、处理xml请求 两种方式&#xff0c;一是直接将请求体数据转成Document对象&#xff1a; 二是定义自己的解析格式将请求体进行解析&#xff1a; 2、返回xml格式数据响应 设置响应头格式为application/xml类型

.NET Core:新的快速开发平台

.NET Core 今年已经发布了 2.0 版本了。技术雷达最近将 .NET Core 从“评估”移到了“试用”阶段&#xff0c;意味着运用这项技术的风险在不断减小。本文将简要介绍基于 .NET Core 的快速开发的方式。.NET Core 产生于 2014年&#xff0c;是一个不折不扣的新开发平台。SmallTal…

7、play中的文件上传

1、基本的文件上传处理 将form的类型设置成multipart/form-data&#xff0c;请求的方式必须是POST类型&#xff0c;实例如下&#xff1a; 请求发到controller&#xff0c;controller中处理&#xff1a; public Result upload() {MultipartFormData<TemporaryFile> bod…

分布式高性能消息处理中心HPMessageCenter

HPMessageCenter高性能消息分发中心。用户只需写好restful接口&#xff0c;在portal里面配置消息的处理地址&#xff0c;消息消费者就会自动访问相关接口&#xff0c;完成消息任务。&#xff08;其实HPMessageCenter有两个版本&#xff0c;这次开源的是第二个版本。在第一个版本…

8、play框架中持久层操作

1、使用jdbc连接数据库 1、1 简介 JDBC是一个阻塞操作&#xff0c;它将导致线程等待&#xff0c;直接使用JDBC进行查询将导致性能降低 1、2 配置数据源 play提供了一个用于管理JDBC连接池的插件&#xff0c;可以根据需要配置任意多个数据库&#xff0c;想要使用此插件&…

DBCHM-最简单、实用的数据库表列批注维护工具

DBCHM支持SqlServer/MySql/Oracle/PostgreSQL/Sqlite等数据库的表列批注维护管理。DBCHM有以下几个功能表&#xff0c;列的批注可以编辑保存到数据库。表&#xff0c;列的批注支持通过pdm文件导入的方式进行更新到数据库。基于数据库中的表列结构(列ID/列名/数据类型/长度/精度…

浅谈Log4net在项目中如何记录日志

一 引入背景在软件开发周期中&#xff0c;无论是开发中&#xff0c;或是测试中&#xff0c;或是上线后&#xff0c;选择合适的工具监控程序的运行状态至关重要&#xff0c;只有如此&#xff0c;才能更好地排查程序问题和检测程序性能问题等。本篇文章主要与大家分享&#xf…

9、play中缓存的使用

1、简介 对于存储在缓存中的任何数据&#xff0c;都需要放置一个再生策略&#xff0c;以防数据丢失。这一理念是play基本原则之一。对于进程内缓存&#xff0c;Caffeine 通常是最佳选择。如果需要分布式缓存&#xff0c;play提供了Memcached和Redis的第三方插件。 2、添加缓存…

10、使用ws调用Rest api

目录 1、简介 2、添加WS配置 3、发送请求 4、处理请求 5、常用模式和用例 6、自定义BodyReadables和BodyWritables 6、独立WS 7、访问AsyncHttpClient 8、配置WS 1、简介 有时我们想从一个play应用程序中调用其他HTTP服务。Play提供了WS库来进行异步HTTP方法调用。 …

拥抱开源,Office 365 开发迎来新时代

前言作为全球最大的开放源代码托管平台&#xff0c;Github在上周迎来了它的十岁生日。自从2008年正式上线以来&#xff0c;Github上面汇聚了数以千万计的开发人员和各种项目&#xff0c;它几乎成为了开源的代名词和风向标&#xff0c;各大软件巨头都纷纷支持&#xff0c;在广大…

11、OAuth和OpenID服务

1、OAuth 1、1 简介 OAuth是发布受保护数据并与之交互的简单方法。对于人们来说&#xff0c;这也是一种更安全的访问方式。例如&#xff0c;它可以用来访问你的用户在Twitter上的数据。Play仅提供对OAuth 1.0的支持。 1、2 基本工作原理 在build.sbt中添加配置&#xff1a;…

求凸函数极值 CSF迭代法(雾)

简介 本算法用来求解凸函数极值点的问题&#xff0c;由我在写ACM习题时想到&#xff0c;在网上并未找到这样的算法&#xff0c;拿出来给大家分享一下&#xff0c;如果网上没有的话&#xff0c;我决定给它起名叫做 CSF迭代法&#xff0c;如果这个算法早已经存在&#xff0c;那就…

12、play整合Akka

1、简介 Akka使用actor模型来提高抽象级别&#xff0c;并提供一个更好的平台来构建正确的并发和可扩展的应用程序。在容错方面&#xff0c;它采用了“Let it crash”的模式&#xff0c;这种模式在电信行业获得了巨大成功&#xff0c;用于构建永不停止的自我修复系统应用程序。…

ASP.NET Core 添加统一模型验证处理机制

一.前言模型验证自ASP.NET MVC便有提供&#xff0c;我们可以在Model(DTO)的属性上加上数据注解&#xff08;Data Annotations&#xff09;特性&#xff0c;在进入Action之前便会根据数据注解&#xff0c;来验证输入的数据是否合法&#xff0c;下面介绍以下如何统一处理验证并返…

13、play中实现信息国际化

目录 1、指定应用使用的语言 2、语言配置文件 3、在Controller中使用 4、在模板中使用 5、改变当前请求的语言 6、格式化信息 1、指定应用使用的语言 在conf/application.conf中进行配置&#xff1a; 这些语言标记将用于创建play.i18n.Lang实例。要访问应用程序支持的语…

讨论过后而引发对EF 6.x和EF Core查询缓存的思考

前言最近将RabbitMQ正式封装引入到.NET Core 2.0项目当中&#xff0c;之前从未接触过这个高大上的东东跟着老大学习中&#xff0c;其中收获不少&#xff0c;本打算再看看RabbitMQ有时间写写&#xff0c;回来后和何镇汐大哥探讨了一点关于EF和EF Core的内容&#xff0c;于是乎本…