1.首先要开启令牌功能
config.php内添加如下:
'TOKEN_ON'=>true, //使用令牌
'TOKEN_NAME'=>'think_html_token', // 表单令牌名称,TP会在模板form内自动生成一个隐藏域,域名就是这个字符串
'TOKEN_TYPE'=>'md5', //令牌加密方式,换用其他加密也可以
2.生成令牌
protected function saveToken(){-
$tokenType = C('TOKEN_TYPE');//获取了config里的'TOKEN_TYPE'配置-
$token = $tokenType(microtime(TRUE));//这里用md5方法加密了时间,-
Session::set(C('TOKEN_NAME'),$token);- }
-
// 验证令牌-
protected function isValidToken($reset=false){-
$tokenName = C('TOKEN_NAME');- if(
$_REQUEST[$tokenName]==Session::get($tokenName)){-
$valid=true;-
$this->saveToken();- }else {
-
$valid=false;- if(
$reset) $this->saveToken();- }
- return
$valid;- }
3.案例演示
View里有Form,并且config里开启了令牌的话,在生成缓存文件的时候,会自动加一个隐藏域,代码如下:
- <?php if(C("TOKEN_ON")):?><input type="hidden" name="<?php echo C("TOKEN_NAME");?>" value="<?php echo Session::get(C("TOKEN_NAME")); ?>"/>
- <?php endif;?>
这时候在XxxAction.clas.php文件内,在display含有表单的页面之前,调用一下saveToken()方法,并且在接受页面调用isValidToken()方法,就OK了,下面是我的IndexAction.class.php测试代码。
- <?phpclass IndexAction extends Action{
- public function
index(){-
$this->saveToken();-
$this->display();- }
- public function
checktoken(){- if(
$this->isValidToken()){- echo
'提交成功!';- }
- else{
- echo
'不能重复提交啦!';- }
- }
- }
?>