ajax 在运行脚本之前检查用户是不是登录

Posted

技术标签:

【中文标题】ajax 在运行脚本之前检查用户是不是登录【英文标题】:ajax check user logged in before running scriptajax 在运行脚本之前检查用户是否登录 【发布时间】:2014-07-15 13:08:58 【问题描述】:

我在我的网站上实施了一个非常基本的投票系统。当用户单击链接时使用以下 ajax 将投票添加到数据库中并且投票更新 +1。

这一切都很好,但我想在允许他们投票之前检查用户是否登录,如果没有显示错误弹出或重定向到登录页面(最终我将显示一个灯箱弹出窗口,要求他们登录或注册。

<script type="text/javascript">
    $(document).ready(function() 
        $(".voteup a").click(function() 
            var ID = <?php echo $moviedetails['id'] ?>
            //$("#vote").text();
            var rating = <?php echo $vote['vote_up'] ?>
            var queryString = 'id=' + ID + '&vote=' + rating;
            $("#voteup").text (rating + 1);
            $.ajax(
                type: "POST",
                url: "vote_up.php",
                data: queryString,
                cache: false,
                success: function(html) 
                    $("#votethanks").html('Thanks');
                    $("#votethanks").slideDown(200).delay(2000).fadeOut(2000);
                
            );
        );
    );
</script>

和 vote_up.php

<?php
require_once("header.php");

$data = $_POST['id'];   

$updatevote = "UPDATE `vote` SET `vote_up` = vote_up +1 WHERE `movie_id` = '$data'";
mysqli_query($con, $updatevote);

?>

我试过了

if (!(isset($_SESSION['sess_user_id']) && $_SESSION['sess_user_id'] != '')) 
echo "<script>alert('Please login.')</script>";

else  //then the javascript

但它只是检查页面加载时登录的用户,如果没有显示请登录错误,但我需要它来执行此操作 onclick 的 javascript。

任何帮助表示赞赏

谢谢 李

【问题讨论】:

【参考方案1】:

您可以考虑在 vote_up.php 中使用 PHP 进行检查,并在您的 ajax 中检查响应。像这样的:

$.ajax(
    type: "POST",
    url: "vote_up.php",
    data: queryString,
    cache: false,
    success: function(result) 
        if (result.error) 
            alert(result.msg);
         else 
            $("#votethanks").html(result.msg);
            $("#votethanks").slideDown(200).delay(2000).fadeOut(2000);
        
    
);

在你的 vote_up.php 中:

<?php

if (!(isset($_SESSION['sess_user_id']) && $_SESSION['sess_user_id'] != '')) 

    // User is not logged in!
    $result = array(
        'error' => true,
        'msg' => 'Please login first!'
    );

 else 

    // write the needed code to save the vote to db here

    $result = array(
        'error' => false,
        'msg' => 'Thanks!'
    );


// Return JSON to ajax call
header('Content-type: application/json');
echo json_encode($result);

【讨论】:

【参考方案2】:

为什么不使用 PHP 插入 authenticated 变量,就像使用 voteID 一样?

例如:

var authenticated = &lt;?php !(isset($_SESSION['sess_user_id']) &amp;&amp; $_SESSION['sess_user_id'] != '') ?&gt;

注意:完全未经测试。我刚刚从您的“我尝试过...”中复制并粘贴了 php 代码

这有帮助吗?

【讨论】:

【参考方案3】:

添加一个布尔值。每次用户点击投票时,发送ajax调用检查用户是否登录。

$(document).ready(function()

    $(".voteup a").click(function()
    
        var the_user_is_logged_in;
        the_user_is_logged_in = checkLoggedIn();
        if the_user_is_logged_in
            // do ajax call
        
        else
            alert('Please log in!')
        
     
 

 function checkLoggedIn()
    $.get('getsession.php', function (data) 
        return data;
    );

getsession.php 你应该写

<?php
session_start();
print json_encode($_SESSION);

我没有尝试代码,但它应该可以工作。

【讨论】:

变量 the_user_is_logged_in 总是返回到 UNDEFINED。【参考方案4】:

这最终对我有用。我分享这个只是为了帮助遇到同样问题并最终偏头痛的人。

ajax 脚本:

<script type="text/javascript">
function review_likes ( addresscommentid ) 
 $.ajax(  type    : "POST",
async   : false,
data    :  "txt_sessionid" : addresscommentid , 
url     : "functions/review_likes.php",
beforeSend: function() 
    // checking if user is logged in with beforeSend
   <?php if (!(isset($_SESSION['signed_in_uid']) && 
$_SESSION['signed_in_uid'] 
   != ''))  ?>        
       $(window.location.href = 'admin/index-signin.php');  
    <?php  ?>
    ,
success : function ( sessionid )

 
$('#reviewlikes').removeClass('like-action'); 
$('#reviewlikes').load(document.URL +  ' #reviewlikes');       
,
error   : function ( xhr )
 
alert( "You are not Logged in" );

 );

 return false;


</script>

在review_likes.php 页面标题上:

<?php 

$kj_authorizedUsers = "";
$kj_restrictGoTo = "../admin/index.php";
if (!((isset($_SESSION['kj_username'])) && 
(isAuthorized("",$kj_authorizedUsers, 
$_SESSION['kj_username'], $_SESSION['kj_authorized']))))    
$kj_qsChar = "?";
$kj_referrer = $_SERVER['PHP_SELF'];
if (strpos($kj_restrictGoTo, "?")) $kj_qsChar = "&";
if (isset($_SERVER['QUERY_STRING']) && strlen($_SERVER['QUERY_STRING']) > 0) 
$kj_referrer .= "?" . $_SERVER['QUERY_STRING'];
$kj_restrictGoTo = $kj_restrictGoTo. $kj_qsChar . "accesscheck=" . 
urlencode($MM_referrer);
header("Location: ". $kj_restrictGoTo); 
exit;
 
?>

上面的代码有点矫枉过正,但它有助于在成功登录后获取当前 URL 并将用户重定向到请求页面。

【讨论】:

以上是关于ajax 在运行脚本之前检查用户是不是登录的主要内容,如果未能解决你的问题,请参考以下文章

检查用户登录的ajax页面是不是改变

用于检查Active Directory用户上次登录的Powershell脚本

Angular 6 AngularFireAuth检查用户是不是在页面呈现之前登录

在加载html之前运行脚本vuejs [重复]

PHP - 当域的IP专用时检查域是不是与服务器的IP匹配

Symfony 5:如何在登录前检查用户是不是被禁止