通过Ajax

时间:2016-01-20 14:39:13

标签: javascript php jquery ajax token

我正在使用令牌系统通过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 :(得分: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 );
?>