Проверьте, что пользователь вошел в систему с помощью Jquery - PullRequest
0 голосов
/ 08 декабря 2009

Интересно, если кто-нибудь может помочь ..

Я добавляю 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');
}
}

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

Спасибо

Ответы [ 5 ]

1 голос
/ 08 декабря 2009

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

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

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

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

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

1 голос
/ 08 декабря 2009

Переменная 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');
  }
});

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

Дополнительная информация о функции:

1 голос
/ 08 декабря 2009

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

$.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 голосов
/ 08 декабря 2009

Есть две проблемы с кодом.

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

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

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

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

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

$.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');
  }
}
0 голосов
/ 08 декабря 2009

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

  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) в ваш обратный вызов из метода $.getJSON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...