У меня есть php-файл в каталоге include. Удобство заключается в отображении изображения captcha. В этом файле я устанавливаю переменную сеанса следующим образом:
$code = codegenerator(); $session =& JFactory::getSession(); $session->set('security_code', $code);
Эта переменная сеанса задается из образа src
который вызывает этот метод с контроллера.
Затем я вызываю контроллер, чтобы проверить этот сеанс, который был установлен (этот метод является trigerd с ajax из iframe), и в этом методе я делаю это
$session = JFactory::getSession(); $seccode=$session->get('security_code'); echo $seccode.':'.rand();
Результат, как и ожидалось, первый раз, код, который был установлен, и случайное число. Если я обновляю эту страницу, изображение captcha будет сброшено с помощью нового кода и отобразится. Но когда я снова запускаю событие проверки, я получаю предыдущий код с новым случайным числом. В этом rand()
есть доказательство того, что JFactory::getSession();
кэшируется, потому что я получаю новое случайное число, но тот же предыдущий код, а не новый, как предполагалось. Так что это не то, что ajax что-то кэширует здесь.
Как я могу избежать JFactory::getSession();
получить кеширование из firefox? Это происходит только в firefox. Internet Explorer и хром, похоже, правильно отображают код сеанса. Если я очистил деньги от firefox и обновил страницу, он все равно не работает. Это похоже на то, что оно хранится навсегда. Если я закрою firefox и снова открою его, то все, похоже, будет работать в первый раз, но тогда у меня снова будет такая же проблема.
Вот код, который генерирует капчу
<?php defined('_JEXEC') or die('Restricted access'); class CaptchaSecurityImages { var $font='monofont.ttf'; function generateCode($characters) { /* list all possible characters, similar looking characters and vowels have been removed */ $possible = '23456789bcdfghjkmnpqrstvwxyz'; $code = ''; $i = 0; while ($i < $characters) { $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1); $i++; } return $code; } function CaptchaSecurityImages($width='220',$height='40',$characters='6') { $code = $this->generateCode($characters); //$font='includes'.DS.'monofont.ttf'; $font='monofont.ttf'; $this->font=$font; $session =& JFactory::getSession(); $session->set('security_code', $code); /* font size will be 75% of the image height */ $font_size = $height * 0.75; $image = @imagecreate($width, $height) or die('Cannot initialize new GD image stream'); /* set the colours */ $background_color = imagecolorallocate($image, 255, 255, 255); $text_color = imagecolorallocate($image, 20, 40, 100); $noise_color = imagecolorallocate($image, 100, 120, 180); /* generate random dots in background */ for( $i=0; $i<($width*$height)/3; $i++ ) { imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color); } /* generate random lines in background */ for( $i=0; $i<($width*$height)/150; $i++ ) { imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color); } /* create textbox and add text */ $textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function'); $x = ($width - $textbox[4])/2; $y = ($height - $textbox[5])/2; imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function'); /* output captcha image to browser */ header('Content-Type: image/jpeg'); imagejpeg($image); imagedestroy($image); } } ?>
И вот код, который вызывается ajax
public function checkCaptchaSecurityCode(){ $securitycode = JRequest::getVar('securitycode'); $session = JFactory::getSession(); $seccode=$session->get('security_code'); echo $seccode.':'.rand(); die(); }
и вот вызов ajax
<?php $checkCaptchaSecurityCode = JRoute::_('index.php?option=com_virtuemart&view=participate&task=checkCaptchaSecurityCode&tmpl=component&format=raw'); ?> jQuery.ajaxSetup({cache: false}); jQuery.ajax({ type: "POST", url: "<?php echo $checkCaptchaSecurityCode ?>", cache: false, data: { securitycode: jQuery("#security_code").val() } }).done(function( msg ) { alert( msg ); });
пожалуйста помоги
У меня была та же проблема, но при вызове метода clear перед установкой новой переменной сеанса исправлена проблема.
$session = & JFactory::getSession(); /* this way unset data from the session store */ $session->clear('security_code'); /* and now set the new value */ $session->set('security_code', $code);
Он работает, даже если вы впервые объявляете переменную сеанса.
Вы отправляете / получаете на mydomain.com, когда с http://www.mydomain.com? Это приведет к тому, что joomla создаст новый сеанс, который я считаю.