Задать вопрос
@ruslite

Как правильно реализовать задержку в чате?

Привет. Вот у меня есть чат. Я на клиентской стороне реализовал задержку отправки сообщений. Это чтобы не флудили чат. Используется node.js, php, socket. Вот мой код задержки. Но любой желающий может удалить ее в консоле браузера. Как быть?
var socket = io.connect( 'http://localhost:8080' );
var socketEmitLastCallTime = 0;
$( "#messageForm" ).submit( function(e) { e.preventDefault();
	var nameVal = $( "#nameInput" ).val();
	var msg = $( "#messageInput" ).val();
	var canalVal = $( "#canalInput" ).val();
    var aqwsde = Date.now() - socketEmitLastCallTime;
	if(aqwsde >= 2 * 1000) {
		socketEmitLastCallTime = Date.now();
		socket.emit( 'message', { name: nameVal, message: msg, canal: canalVal } )
	    $( "#messageInput" ).val('');
			// Ajax call for saving datas
		$.ajax({
			url: "./ajax/insertNewMessage.php",
			type: "POST",
			data: { name: nameVal, message: msg, canal: canalVal },
			success: function(data) {
			}
		});
   }else {
   var alert = $('span.alert');
alert.show();
alert.html('Time!!!');
alert.fadeOut(3000);
   //$('span.alert').html('Нельзя отправлять сообщения чаще, чем раз в 2 секунды');
   //alert('Нельзя отправлять сообщение чаще 2 секунд');
   }
});



socket.on( 'message', function( data ) {
	var actualContent = $( "#messages" ).html();
	var newMsgContent = '<li> <strong>' + data.name + '</strong> : ' + data.message
																					.replace(new RegExp("&#D83DDE04",'gi'),"<img src='../packs/basic/D83DDE04.png' height='21' width='21'>")
																					.replace(new RegExp("&#D83DDC8A",'gi'),"<img src='../packs/basic/D83DDC8A.png' height='21' width='21'>") + '</li>';
	var content = newMsgContent + actualContent;
	$( "#messages" ).html( content );
});
  • Вопрос задан
  • 3124 просмотра
Подписаться 2 Оценить 3 комментария
Решения вопроса 1
Dunadan
@Dunadan
Только проверка на сервере.
Иначе обиженный ребенок сможет написать скрипт-флудилку.
По коду не вполне ясно, зачем Вы отправляете данные и в ноду, и дергаете пхп-скрипт.
Используйте что-то одно. В крайнем случае - проксируйте данные с ноды в пхп, иначе у Вас может наступить рассинхронизация состояний.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
dizballanze
@dizballanze
Software developer at Yandex
Реализовать задержку на сервере, ваш К.О.
Ответ написан
keksmen
@keksmen
Just a programmer
Проще не использовать задержку на клиенте, а на сервере притормаживать все запросы до поры. Например, получаем время последнего обращения и тормозим так, чтобы клиент всяко получил ответ не менее через n секунд после пред. обновления. Главное - не переборщить, иначе ошибка 408 обеспечена. Проблема DDOS'а из браузера отпадает т.к. они сами лимитируют количество подключений к одному хосту.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы