让token令牌的session永远保持1个

原来的token是每个页面对应一个session来存放__hash__值,
我的每个页面头部都有一个登录框,用户每访问一个页面就会产生一个token,如果用户一直不提交,那么token就不会自动销毁(除非session过期)。
一个解决方案是通过配置文件,关闭令牌,只有在需要的视图中打开配置参数。
但是我觉得我的网站不需要同时多个页面同时提交表单,而且我使用了session db hander扩展,内存表的char字段长度是有限制的,不可能无限存放那么多token。

所以我决定让用户只能保留一个token。
这样做还有一个好处,可以避免用户多个页面同时提交,刷回复什么的
ThinkPHP/lib/Behavior/TokenBuildBehavior.class.php
搜索
  1. // 创建表单令牌
  2.     private function buildToken() {
  3.         $tokenName  = C('TOKEN_NAME');
  4.         $tokenType  = C('TOKEN_TYPE');
  5.         if(!isset($_SESSION[$tokenName])) {
  6.             $_SESSION[$tokenName]  = array();
  7.         }
  8.         // 标识当前页面唯一性
  9.         $tokenKey   =  md5($_SERVER['REQUEST_URI']);
  10.         if(isset($_SESSION[$tokenName][$tokenKey])) {// 相同页面不重复生成session
  11.             $tokenValue = $_SESSION[$tokenName][$tokenKey];
  12.         }else{
  13.             $tokenValue = $tokenType(microtime(TRUE));
  14.             $_SESSION[$tokenName][$tokenKey]   =  $tokenValue;
  15.         }
  16.         $token      =  '<input type="hidden" name="'.$tokenName.'" value="'.$tokenKey.'_'.$tokenValue.'" />';
  17.         return $token;
  18.     }
复制代码
改为:
  1. // 创建表单令牌
  2.     private function buildToken() {
  3.         $tokenName  = C('TOKEN_NAME');
  4.         $tokenType  = C('TOKEN_TYPE');
  5.  //        if(!isset($_SESSION[$tokenName])) {
  6.  //            $_SESSION[$tokenName]  = array();
  7.  //        }
  8.         $_SESSION[$tokenName]=array();//生成令牌前清空已有令牌。
  9.         // 标识当前页面唯一性
  10.         $tokenKey   =  md5($_SERVER['REQUEST_URI']);
  11.         if(isset($_SESSION[$tokenName][$tokenKey])) {// 相同页面不重复生成session
  12.             $tokenValue = $_SESSION[$tokenName][$tokenKey];
  13.         }else{
  14.             $tokenValue = $tokenType(microtime(TRUE));
  15.             $_SESSION[$tokenName][$tokenKey]   =  $tokenValue;
  16.         }
  17.         $token      =  '<input type="hidden" name="'.$tokenName.'" value="'.$tokenKey.'_'.$tokenValue.'" />';
  18.         return $token;
  19.     }
复制代码
这样就可以了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值