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


Refresh token in php page via Ajax

我正在使用令牌系统通过 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>

如何解决这个问题?

假设您的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 );
?>