首页 文章

通过Ajax在php页面中刷新令牌

提问于
浏览
0

我正在使用令牌系统通过Ajax请求php页面,问题是我不能通过ajax从同一页面执行多个请求,因为我无法刷新初始页面中的令牌 .

更准确地说:

我有php页面,我有多个按钮,回忆到不同的ajax函数,从页面内部加载不同的表单或数据而不刷新页面(当然使用ajax),当我请求页面时,请求必须有效令牌,如果没有,页面将不会被加载,当我第一次请求页面时,初始令牌不再有效,所以我不能请求其他页面,因为请求将因令牌而被拒绝 .

编辑:主要的PHP页面

<?php
require_once 'core/init.php';
$token = Token::generate();
?>
<button class='btn btn-warning btn-xs' id='1' onclick='edit(this.id)'>Edit</button>
<button class='btn btn-primary btn-xs' id='3' onclick='edit(this.id)'>Bookings</button>
<div id="edit">
</div>
function edit(id)
{
$(document).ready(function(){
$("#edit").load("ajax_edit.php", {id: id, token: '<?php echo $token ?>'});
});
}

ajax_edit.php

<?php
require_once 'core/init.php';

if(Input::exists('post'))
{
    if(Token::check(Input::get('token')))
    {

    } else
  {
    Redirect::to(404);
  }
}

?>
<form id="Form">
//various input fields
<input type="hidden" name="id" value="<?php echo Input::get('id') ?>">
<button class='btn btn-default btn-sm' type='submit'>Edit</button>
</form>
<script>
var options = { 
    target:     '#Form', 
    url:        'ajax_edit.php',
    type:       'post', 
    success:    function() { 
        alert('Thanks for your edit!'); 
    } 
}; 
$(document).ready(function() {
  $('#Form').ajaxForm(options); 
}); 
</script>

怎么能解决这个问题?

1 回答

  • 0

    假设您的 Token 类具有 refreshnewToken 等函数,您可以添加一个额外的参数,告诉它为进一步的请求返回一个新标记(并要求当前标记验证另一个标记的请求是否有效) .

    HTML将是这样的:

    <form id="#Form">
    <!-- various input fields -->
    <input type="hidden" name="id" value="<?php echo Input::get('id') ?>">
    
    <!-- Here's the new parameter -->
    <input type="hidden" name="getNewToken" value="true">
    <button class='btn btn-default btn-sm' type='submit'>Edit</button>
    </form>
    

    然后将ajax的服务器端代码放在它自己的页面中,没有HTML代码(这样你就可以返回JSON的响应) .

    <?php
    $responseObject = array( "status" => "ok", "response" => array() );
    
    if(Input::exists('post'))
    {
        if(Token::check(Input::get('token')))
        {
            //They want a new token
            if ( isset( $_POST[ "getNewToken" ] ) && $_POST[ "getNewToken" ] == "true" )
            {
                //Add token for another request
                $responseObject[ "response" ][ "token" ] = Token::newToken();
            }
        } else
      {
        Redirect::to(404);
      }
    }
    
    //Now output the response
    echo json_encode( $responseObject );
    ?>
    

相关问题