我正在使用令牌系统通过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>
如何解决这个问题?
答案 0 :(得分:0)
假设您的Token
类具有refresh
或newToken
等函数,您可以添加一个额外的参数,告诉它为进一步的请求返回一个新标记(并要求当前用于验证对另一个令牌的请求是否有效的令牌。)
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 );
?>