文档章节

Session and Flash scopes【翻译】

我是菜鸟我骄傲
 我是菜鸟我骄傲
发布于 2017/04/11 21:00
字数 895
阅读 14
收藏 0

原文:Session and Flash scopes #在Play中的Session and Flash scopes有什么不同

如果你想跨多个HTTP请求存储数据,你需要把它们存储到Session或者Flash scopes中。在Session中的数据存储在整个用户Session周期可用,在Flash scope 存储的数据仅在下次请求时可用。

理解Session 和Flash数据不是存储在服务端而是使用Cookie机制添加到每一个随后的HTTP请求中这一点很重要。这意味着数据大小是非常有限的(最大4K),并且你只能存储String类型的值。Cookie的默认名是 PLAY_SESSION。这可以在应用的配置文件中修改Key

如果Cookie的名字被修改,可以使用在设置和清除Cookie中提到的方法清除之前的Cookie。

当然,由于Cookie值使用了秘钥签名因此客户端不能修改Cookie的数据(或者数据会无效)

Paly没有打算把 Session当缓存用。如果你需要缓存一些与特定Session相关的数据,你可以使用Play内置缓存机制,在用户Session存储一个唯一ID,让这些数据与特定的用户相关联。

默认情况下,Session没有专门的超时。当用户关闭浏览器时它才过期。如果对于特定的应用,你需要一个实用的超时,在用户的Session内存储一个时间戳,而你的应用需要使用它(例如,最大的Session持续时间,最大的不活跃周期等等),你也可以通过配置的Key值play.http.session.maxAge(单位毫秒),设置一个SessionCookie的最大年龄,但是注意这不能防止攻击者获取或重新使用已经过期的数据。

在Session中存储数据

由于Session仅仅是一个Cookie,也只是一个HTTP头。你可以像操作其他结果属性那样操作Session的数据:

Ok("Welcome!").withSession(
"connected" -> "user@gmail.com")

注意,这将会替换掉整个Session。 如果你需要在已存在的Session中添加一个元素,只需要在传入的Session中添加一个元素,并指定为新的Session:

Ok("Hello World!").withSession(
request.session + ("saidHello" -> "yes"))

你可以通过相同的方式从传入的Session中移除任何值:

Ok("Theme reset!").withSession(
request.session - "theme")

获取Session的值

你可以从HTTP请求中获取传入的Session:

def index = Action { request =>
request.session.get("connected").map { user =>
Ok("Hello " + user)
}.getOrElse {
Unauthorized("Oops, you are not connected")
}
}

移除整个Session

这是一个专门移除整个Session的操作:

Ok("Bye").withNewSession

Flash scope

Flash scope的原理跟Session非常像,但是有两点不同:

  • 数据只保存在一个请求中
  • Flash Cookie 没有签名,用户有可能修改这里的值

重点:Flash scope应当仅被用来在简单的非Ajax应用中传输成功/错误信息。由于数据仅保持到下一次请求,并且由于在复杂的Web应用中不能保证请求的顺序,Flash scope受制于竞争条件。

这是几个使用Flash scope的例子:

def index = Action { implicit request =>
Ok {
request.flash.get("success").getOrElse("Welcome!")
}
}

def save = Action {
Redirect("/home").flashing(
"success" -> "The item has been created")
}

在你的视图中获取Flash scope值,增加一个隐式的Flash参数:

@()(implicit flash: Flash)
...
@flash.get("success").getOrElse("Welcome!")
...

在你的Action中,如下所示指定一个implicit request =>:

def index = Action { implicit request =>
Ok(views.html.index())
}

隐式Flash将基于隐式请求提供给视图。

如果出现错误‘could not find implicit value for parameter flash: play.api.mvc.Flash’,那么这是因为你的Action在作用域内没有隐式请求。

© 著作权归作者所有

我是菜鸟我骄傲
粉丝 13
博文 239
码字总数 151276
作品 0
西安
架构师
私信 提问
play2.0文档-面向java开发者(4)

Session and Flash scopes Session和Flash作用域 How it is different in Play 在play中有何不同 If you have to keep data across multiple HTTP requests, you can save them in the Sessi......

老盖
2012/04/09
0
0
Scala下Play框架学习笔记(Session and Flash scopes)

session和flash scope 的区别 如果需要通过多个HTTP请求传输数据,那么就要用到session和flash scope。在session中存储的,整个会话过程都有效,在flash scope 中存储的,只是对下一个请求有...

金明略
2016/12/28
0
0
Spring Bean Scope(作用域)

Spring version : 4.3.19.RELEASE scope the Spring Framework supports seven scopes, five of which are available only if you use a web-aware ApplicationContext.The following scopes......

晨猫
2018/11/23
0
0
《Spring Recipes》第二章笔记:Setting Bean Scopes

《Spring Recipes》第二章笔记:Setting Bean Scopes 问题 Spring容器默认创建的bean都是单例。 解决方案 Spring容器的<bean>元素的scope属性指定了bean的scope。 Table 4.3. Bean scopes 例...

LiJIaming
2012/05/17
0
0
Spring Bean Scopes作用域

当定义一个Spring的<bean>,必须声明bean 作用域的选项。例如,要强制Spring需要产生一个新的bean实例,应该声明bean的scope属性为prototype。如果你希望Spring 每次都返回同一个bean实例,应...

Mr_zebra
2018/10/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何在工作中快速成长?致工程师的10个简单技巧

阿里妹导读:阿里有句非常经典的土话,“今天的最好表现,是明天的最低要求。”如何挖掘潜能、发现更好的自己?今天,阿里巴巴高级无线开发专家江建明将认知升级的方法总结出来,帮助你获得快...

阿里云云栖社区
29分钟前
1
0
PHP和Redis实现在高并发下的抢购及秒杀功能

抢购、秒杀是平常很常见的场景,面试的时候面试官也经常会问到,比如问你淘宝中的抢购秒杀是怎么实现的等等。 抢购、秒杀实现很简单,但是有些问题需要解决,主要针对两个问题: 一、高并发对...

xiaogg
31分钟前
0
0
从数据上看:谁才是漫威的绝对C位

复联4上映了!这次比美国还早了两天。当然,我还没看,不会给你们剧透,当然也不想不剧透。 这一部不仅是灭霸这一线剧情的结局,也被认为漫威第三阶段的收官之作。据说此部之后,不少影迷熟知...

crossin
44分钟前
3
0
Spring Cloud底层原理

毫无疑问,Spring Cloud 是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。 不过大多数讲解还停留在对 Spring Cloud 功能使用的层面,其底层的很多原理,很多人可能并不知晓。 ...

月下狼
53分钟前
5
0
Linux重启Tomcat

在测试过程中,要构建测试环境,还经常要重启Tomcat排查问题,重启Tomcat的步骤: 1、首先查看Tomcat是否有启动或重复启动? 输入命令ps -aux|grep java按回车键,可见下图,是有一个Tomcat启...

测试龙管家
54分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部