2009-12-07 4 views
0

Хотите знать, если кто-нибудь может помочь ..Проверьте пользователь вошел в систему с помощью Jquery

Я добавляю некоторые JQuery на мой сайт, но я хочу, чтобы ограничить некоторые действия, в зависимости от того, зарегистрирован пользователь или нет. Я не уверен, как определить переменную сеанса с помощью JQuery.

Моя первоначальная мысль заключалась в вызове моего checkUser cfc с помощью Jquery Ajax, а затем проверить, сколько строк вернулось от него, и работать оттуда. Но я не уверен, как справиться с этим. На данный момент мой код выглядит следующим образом

$.getJSON('http://localhost:8500/mxRestore/model/mdl_user.cfc?method=getUserData&returnFormat=json&queryformat=column', {}, function(data){ 
    var isLoggedIn = data.ROWCOUNT; 
}) 

if (loggedIn > 0) { 
    // Do this 
} 
else { 
    alert('You are not logged in'); 
} 
} 

Однако я получаю сообщение об ошибке, говорящем переменном Isnt isLoggedIn определен. Подумайте, как лучше справиться с этим.

Благодаря

ответ

1

Переменная isLoggedIn находится вне сферы, где вы используете его, он доступен только в пределах обратного вызова getJSON, рассмотреть возможность работы там:

$.getJSON('...', {}, function(data){ 
    var isLoggedIn = data.ROWCOUNT > 0; // isLoggedIn is now boolean 

    if (isLoggedIn) { 
    // Do something 
    } else { 
    alert('You are not logged in'); 
    } 
}); 

Я также рекомендовал бы вам возвращать логическое значение с сервера, вместо того, чтобы выставлять количество строк.

Более подробная информация о функции объеме:

+0

А у меня была идея установить 'isLoggedIn' в boolean ... и я обещаю, что не вижу ваш код первым :) –

+0

Большое спасибо за ваш ответ – namtax

1

Вы определяете переменную в функции обратного вызова, но использовать его за пределами этой сферы. Вам также нужно переместить код, который выполняет действия, в обратный вызов.

$.getJSON('http://localhost:8500/mxRestore/model/mdl_user.cfc?method=getUserData&returnFormat=json&queryformat=column', {}, function(data){ 
    if (data.ROWCOUNT > 0) { 
     // do this 
    } 
    else { 
     alert('You are not logged in'); 
    } 
}); 

Как правило, хотя, что я буду делать это либо включить или отключить сторону действия сервера - то есть, не обеспечивают код для действий, которые не доступны. Человек с отладчиком всегда может победить ваши проверки на стороне клиента, поэтому вам нужно быть очень осторожным в зависимости от результатов вызова сервера для обеспечения безопасности и всегда проверки на сервере.

+0

У меня есть защита на стороне сервера также ... спасибо – namtax

+0

Или определите эту переменную за пределами области действия – bdukes

+0

@bdukes - вызов ajax является асинхронным, поэтому определение его вне функции разрешит неопределенную ссылку, но это будет не закончите работать так, как вы хотите. Фактически вам нужно запустить код после возврата вызова ajax, а способ сделать это - запустить его в обратном вызове. – tvanfosson

0

Есть несколько проблем:

  1. Вы определяете isLoggedIn но ссылаться на loggedIn.
  2. Вы определяете isLoggedIn внутри функции, но ссылаться на него вне функции

можно исправить с этим:

var loggedIn = null; 
$.getJSON('http://localhost:8500/mxRestore/model/mdl_user.cfc?method=getUserData&returnFormat=json&queryformat=column', {}, function(data){ 
    loggedIn = (data.ROWCOUNT > 0); 
}); 

Таким образом, вы можете проверить в другом месте в коде, как это:

if(loggedIn){ 
    // Do something 
} else if (loggedIn === false) { 
    alert('You are not logged in'); 
} else { 
    // Callback hasn't been run yet 
} 

Если вам нужно запустить этот только один раз, просто поместите весь оператор if (минус else) в свой callb ack от метода $.getJSON.

0

Имеются две проблемы с кодом.

Первое, что вы заметили, состоит в том, что переменная существует только в области анонимной функции, которую вы создали для обработки обратного вызова.

Другая проблема заключается в том, что код, который использует переменную, выполняется до того, как будет установлена ​​переменная.

Запрос на сервер отправляется, тогда функция обратного вызова ожидает ответа, но код, отправляющий запрос, не ждет ответа, поэтому он будет продолжать использовать код с использованием переменной.

Обе эти проблемы решаются путем перемещения кода, который использует переменную, в функцию обратного вызова.

Альтернативно, поместите код, который использует переменный в отдельной функции, и вызвать эту функцию из функции обратного вызова:

$.getJSON(
    'http://localhost:8500/mxRestore/model/mdl_user.cfc?method=getUserData&returnFormat=json&queryformat=column', 
    {}, 
    function(data) { 
    handleCallBack(data.ROWCOUNT > 0); 
    } 
); 


function handleCallBack(isLoggedIn) { 
    if (isLoggedIn) { 
    // Do this 
    } else { 
    alert('You are not logged in'); 
    } 
} 
1

Поскольку у вас уже есть несколько хороших ответов, позвольте мне бросить справедливое предупреждение в обсуждение:

1) Было бы намного больше смысла манипулировать тем, что видит пользователь, прежде чем отправлять страницу клиенту, устраняя сложность вашего подхода.

2) Не полагайтесь на сценарий клиентской стороны как единственное средство защиты функции от пользователей, которые не вошли в систему. Код безопасности на стороне клиента, подобный этому, можно обойти, просто отключив скрипты или отредактировав содержимое на странице, чтобы прокомментировать проверку безопасности.

3) Если вы абсолютно необходимо сделать это таким образом, чтобы сервер повторно проверить учетные данные/состояние входа в систему, когда действие начинается, даже если код клиент уже сделал ..

4) избыточную проверку Я предложил в пункте №3 еще одна веская причина просто сделать это с серверными сценариями вместо клиентской JS/JQUERY.

+0

Чтобы объяснить, у меня есть ссылка, используемая для голосования, с отключенным javascript эта ссылка защищена кодом на стороне сервера. Вы не можете голосовать, если вы не вошли в систему. Когда JS включен, Jquery присоединяет функцию к ссылке на голосование, которая разрешает голосование ajax, но позволяет тем, кто не вошел в систему, голосовать. Как я могу сделать это более безопасным? Спасибо – namtax

+0

Несколько предложений 1) вместо того, чтобы использовать JQuery, чтобы включить ссылку для голосования, добавьте функцию в ссылку при создании страницы на сервере и отправьте ее, когда ссылка активирована или деактивирована по мере необходимости. 2) Когда голосование отправляется на сервер, повторите проверку сервером, чтобы пользователь мог проголосовать, даже если с помощью кода на стороне клиента вы не ожидали, что у них будет активная ссылка. – JohnFx

+0

Прохладный, спасибо за предложения – namtax

Смежные вопросы