【发布时间】:2018-07-29 09:18:21
【问题描述】:
如何在 ajax 请求后重新生成令牌的输入,所以我不需要重新加载页面, 这是我生成令牌的 php 代码
<?php
class Token {
public static function generate() {
return $_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32));
}
public static function check($token){
if(isset($_SESSION['token']) && $token === $_SESSION['token']){
unset($_SESSION['token']);
return true;
}
return false;
}
}
?>
这是我发送 ajax 请求的 jQuery 代码
function load() {
$('#load-data').load('process/karyawan/load.php');
}
function insert(){
$('form').submit(function(e){
e.preventDefault();
var form = $(this);
$.ajax({
type: form.attr('method'),
url: 'process/karyawan/insert.php',
data: form.serialize(),
success: function(result){
load();
}
}
});
});
}
这是我的表格
<form action="" method="post">
<div class="kiri">
<div class="inp">
<input type="text" name="nama_karyawan" placeholder="Nama Karyawan" class="form-control nama_karyawan">
</div>
<div class="inp">
<textarea class="form-control" name="alamat_karyawan" rows="5" placeholder="Alamat Karyawan"></textarea>
</div>
</div>
<div class="kanan">
<div class="inp">
<input type="password" name="password" placeholder="Password" class="form-control">
</div>
<div class="inp">
<input type="text" name="telepon_karyawan" class="form-control" placeholder="Telepon Karyawan">
</div>
<div class="inp">
<input name="akses" class="form-control" value="Admin" readonly>
<div class="error-msg err05"></div>
</div>
<div class="inp">
<input type="submit" name="insert" value="Simpan" class="btn btn-success col-sm-12">
<input type="hidden" name="token" value="<?=Token::generate();?>">
</div>
</div>
</form>
这是我的 load.php 文件
<?php
session_start();
require_once('../../classes/Config.php');
require_once('../../classes/Database.php');
require_once('../../classes/Query.php');
require_once '../../classes/ErrorHandler.php';
require_once '../../classes/Validator.php';
require_once '../../classes/Token.php';
$connection = new Database($host, $username, $password, $database);
$main = new Query($connection);
$table = 'karyawan';
$selectData = $main->select($table);
while($fetchData = $selectData->fetch_object()){
if(@$_SESSION['owner']){
$delete = '<a href="?page=deleteKaryawan&id_karyawan='.$fetchData->id_karyawan.'"><i class="fa fa-trash"></i></a>';
$button = '<td class="text-center">'.$delete.'</td>';
}else{
$button = null;
}
echo '<tr>
<td class="text-center">'.$fetchData->id_karyawan.'</td>
<td class="text-center">'.$fetchData->nama_karyawan.'</td>
<td class="text-center">'.$fetchData->alamat_karyawan.'</td>
<td class="text-center">'.$fetchData->telepon_karyawan.'</td>
<td class="text-center">'.$fetchData->akses.'</td>
'.$button.'
</tr>';
}
?>
对于第一个请求,代码运行良好,但对于第二个请求,我认为它不会再运行良好了,因为我取消了设置令牌.. 有人可以给我一个建议,让我在 ajax 请求后重新生成一个令牌吗?谢谢
【问题讨论】:
-
在你的
insert.php中,调用Token::check()之后,你能不能再次Token::generate()发送它让Javascript改变<input name="token">字段?你的 Javascriptload()是什么? -
我的 Javascript load() 是这样的: $('#load-data').load('process/karyawan/load.php');这是 load.php 正在加载内容。我可以在 ../load.php 中使用 Token::generate() 以便令牌始终自动重新生成吗?
-
是的。但是,如果您希望您的表单再次工作,而无需重新加载页面,您必须将新令牌发送到您的 Javascript,并更新令牌字段。
-
你能告诉我怎么做吗,老实说,我不知道如何将新令牌发送到我的 javascript。
-
能否在您的问题中发布您的
update.php?