web应用里的flash message的作用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/varding/article/details/49335699

flash 提示信息一般显示一段很简单的信息告知登录之类的信息,具体如下图:
这里写图片描述

正常情况下的登陆页面应该是下面这个样子的,就是没有任何信息提示:
这里写图片描述

登陆成功后的主页显示“登陆成功”的提示
这里写图片描述

flash信息显示的时候也许会比较特别,不过这并不是他特有的,显示的效果只不过是html渲染的结果而已。

这儿要讲的是这种技术实现的背景以及方法

看到上面这两个图片大家也许觉得很好做,登陆出错的时候直接渲染一个登陆页面并且加一个“账号或者密码错误”的信息就可以了

我们现在来具体看看浏览器请求和服务器处理的过程:

  1. 客户端打开登陆页面
    client=>login:get
  2. server收到请求后返回登陆页面
    server=>login.html
  3. 用户填写完毕后发送post消息
    client=>login:post
  4. server验证登陆
    • 成功
      redirect到登录前的网页并显示“登陆成功”
    • 失败
      redirect到login.html,这样回到步骤1,但这个时候需要显示“登陆错误”消息

其实失败了有两种方法,上面只是用了flash提示的方法,具体两种如下:

  • 直接渲染并且返回一个“登陆错误”的特殊页面,这个很好理解也很容易做
  • 继续redirect到login:get页面并且显示登陆错误信息

第二种方法看似简单其实需要处理的是:对于login controller来说他怎么知道需要给客户端显示登陆错误还是返回普通的登陆页面?

也就是login:post controller需要给redirect后的login:get controller发送一个消息告诉他上次登陆失败了,但redirect是发送一个url让浏览器重新发送请求的过程,所以两个controller无法直接发送消息

既然是服务器端内部的消息共享,那么这个可以存储在session里吗?
我们来设想下:login:post发送登陆失败就在对应session里写入一个标记,login:get渲染页面的时候检查是否有登陆失败标记,如果有就在渲染的页面里加一个“登陆失败”的信息提示就可以了。
但极端情况下,如果客户端没有收到redirect消息(断网,断电,丢失连接)那么下次客户端login:get的时候会显示一个 登陆错误提示,这个显然是不合理的(假设session还没过期)

另一个方法就是ruby on rails里提供的flash方法,就是login:post检测发现错误了就给客户端加一个cookie并且发送redirect到login:get,这样下次login:get收到请求后发现cookie里有flash消息就知道上一次登陆错误了,那么渲染的时候附带一个错误消息就可以了,如果cookie没有附带这个特殊消息就正常渲染。

如果客户端没有收到login:post的redirect也没关系,下次再获取login:get的时候就是正常页面,不会1天以后第一次登陆就显示登陆错误了

另外login:get发现了flash一定要及时清除,不然以后这个cookie一直存在,设置对应cookie的expire时间就可以了,设置成1970年,也可以同时把flash对应的value删除

flash具体用什么key保存是没关系的,只要与其他cookie不冲突就可以了,默认可以用flash,_flash之类的

猜你喜欢

转载自blog.csdn.net/varding/article/details/49335699