2014-02-18 23 views
0

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

В моем случае это особенно важно, поскольку я прошу моих пользователей ввести потенциально более 100 ответов на вопросник (немного похожий на форму налога на прибыль). Поэтому вполне понятно, что они не могут отвечать на все эти ответы все время, не время от времени испытывая тайм-аут сеанса.

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

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

Но у меня есть сомнения относительно эффективности моего решения. Когда я просматриваю информацию о сеансе, хранящуюся в файле cookie на ПК клиента (например, на моем ПК, используя настройку XAMMP-PHP-MySQL), я вижу всю информацию, которую я только что сохранил в базе данных, красиво сижу в файле cookie , Файл cookie по-прежнему остается на ПК клиента после истечения времени ожидания сеанса. Должно ли мне не намного проще читать содержимое cookie этого клиента в новый сеанс после того, как клиент снова зашел в систему? Я знаю имя печенья. Но я не могу найти хороший пример чтения пар ключ => значений из файла cookie в новые переменные сеанса. Куки выглядит следующим образом:

last_active|i:1392715552;loginName|s:4:"Carl";password|s:7:"secret";answer|s:17:"log in and finish";auth|s:3:"yes";logname|s:4:"Carl";LastLogin|s:19:"2014-02-18 15:59:16";SearchCredits|s:4:"1144";UniqueClockRecordID|s:13:"530320ebd7d20";ClockType|s:0:"";ClockMaterial|s:0:"";MovementDuration|s:0:"";TypeOfTrains|s:0:"";SameBarrel|s:0:"";PassingStrike|s:0:"";TypeStriking|s:0:"";StrikingMechanism|s:0:"";ChimeMelodies|s:4:"NULL";ChimeMechanism|s:0:"";BellOrGong|s:0:"";HowManyBells|s:0:"";SortGong|s:0:"";WheelsGoingTrain|s:4:"NULL";WheelsStrikingTrain|s:4:"NULL";WheelsChimingTrain|s:4:"NULL";WheelsAlarmTrain|s:4:"NULL";SubTypeLongcase|s:0:"";SubTypeChronometer|s:0:"";SubTypeStreet|s:0:"";SubTypeTable|s:0:"";SubTypeTurret|s:0:"";TypeAutoWinder|s:0:"";SubTypeWall|s:0:"";EscapementType|s:0:"";PlatformEscapementType|s:0:"";HowManyDials|s:0:"";SettingDial|s:0:"";ClockmakerOnDial|s:4:"NULL";RetailerOnDial|s:4:"NULL";CityOnDial|s:4:"NULL";CountryOnDial|s:4:"NULL";SayingOnDial|s:4:"NULL";AnythingElseOnDial|s:4:"NULL";FakeRealClockmaker|s:0:"";Clockmaker|s:4:"NULL";BestGuessClockmaker|s:4:"NULL";ClockmakerClockNumber|s:4:"NULL";ClockmakerOnClockPlates|s:4:"NULL";AnythingElseOnPlates|s:4:"NULL";OtherMarksOnClock|s:4:"NULL";ClockCountry|s:4:"NULL";EarliestClockMadeDate|s:10:"0000-00-00";LatestClockMadeDate|s:10:"0000-00-00";BestGuessClockMadeDate|s:10:"0000-00-00";MarriageOriginal|s:0:"";MarriageDescription|s:4:"NULL";Damaged|s:0:"";DamageDescription|s:4:"NULL";CaseStyle|s:0:"";BuildingType|s:0:"";CaseMaterial|s:0:"";CaseHeight|s:4:"NULL";CaseWidth|s:4:"NULL";CaseDepth|s:4:"NULL";PlinthHeight|s:4:"NULL";PlinthWidth|s:4:"NULL";PlinthDepth|s:4:"NULL";TrunkHeight|s:4:"NULL";TrunkWidth|s:4:"NULL";TrunkDepth|s:4:"NULL";HoodHeight|s:4:"NULL";HoodWidth|s:4:"NULL";HoodDepth|s:4:"NULL";CaseOther|s:4:"NULL";DialShape|s:0:"";DialDiameter|s:4:"NULL";DialHeight|s:4:"NULL";DialWidth|s:4:"NULL";DialThickness|s:4:"NULL";DialMaterial|s:0:"";FalsePlate|s:0:"";Hands|s:0:"";HandsMaterial|s:0:"";SubDials|s:0:"";ClockLevers|s:0:"";WeightSpring|s:0:"";GoingTrainWeight|s:4:"NULL";StrikingTrainWeight|s:4:"NULL";ChimingTrainWeight|s:4:"NULL";AlarmTrainWeight|s:4:"NULL";LengthSpringGoing|s:4:"NULL";HeightSpringGoing|s:4:"NULL";ThicknessSpringGoing|s:4:"NULL";LengthSpringStriking|s:4:"NULL";HeightSpringStriking|s:4:"NULL";ThicknessSpringStriking|s:4:"NULL";LengthSpringChiming|s:4:"NULL";HeightSpringChiming|s:4:"NULL";ThicknessSpringChiming|s:4:"NULL";LengthSpringAlarm|s:4:"NULL";HeightSpringAlarm|s:4:"NULL";ThicknessSpringAlarm|s:4:"NULL";GoingFusee|s:0:"";StrikingFusee|s:0:"";ChimingFusee|s:0:"";NumberOfPillars|s:4:"NULL";PlatesShape|s:0:"";PlateDiameter|s:4:"NULL";A_PlateTopWidth|s:4:"NULL";A_PlateBottomWidth|s:4:"NULL";PlateHeight|s:4:"NULL";PlateWidth|s:4:"NULL";FrameDepth|s:4:"NULL";PlateThickness|s:4:"NULL";CalendarType|s:0:"";MaintainingPowerType|s:0:"";StrikeSilent|s:0:"";RiseFall|s:0:"";PullRepeat|s:0:"";HoldFast|s:0:"";WindingKey|s:0:"";CaseKey|s:0:"";Pendulum|s:3:"yes";PendulumLength|s:6:"234567";PendulumTemperatureCompensation|s:3:"yes";PendulumTemperatureCompensationType|s:0:"";BalanceTemperatureCompensation|s:0:"";BalanceTemperatureCompensationType|s:0:"";PictureClockURL|s:4:"NULL";PictureClockImg|s:4:"NULL";AuctionedWhen|s:10:"0000-00-00";AuctionHouse|s:0:"";AuctionLotNumber|s:4:"NULL";AuctionedInCity|s:4:"NULL";RealisedAuctionValue|s:4:"NULL";RealisedAuctionValueCurrency|s:0:"";EstimatedValueClock|s:4:"NULL";EstimatedValueClockCurrency|s:0:"";MoreInfoOnClock|s:4:"NULL";OtherPartsToClock|s:4:"NULL";TickingSoundClock|s:4:"NULL";StrikingSoundClock|s:4:"NULL";ChimingSoundClock|s:4:"NULL";AlarmSoundClock|s:4:"NULL";ClockForSale|s:0:"";PriceForSale|s:4:"NULL";PriceForSaleCurrency|s:0:"";Stolen|s:0:"";MissingDate|s:10:"0000-00-00";FinalComment|s:4:"NULL"; 

Хотя содержание печенья четко показывает дизайн клавиша => парного значения, я считаю, что это просто записываются в виде одной длинной строки. Мне нужен какой-то парсер, чтобы написать этот файл cookie в новые переменные сеанса. Существует ли существующая программа?

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

+0

Пожалуйста, скажите мне, что вы не хранить клиентов имя пользователя и пароль в постоянном куки на клиентском компьютере. – Anigel

+0

1) Данные сеанса не хранятся в файлах cookie на стороне клиента. Как он туда попал? 2) Почему бы просто не сделать очень длительный тайм-аут сеанса? 3) Почему бы просто не хранить все данные в базе данных, а не использовать этот двухуровневый подход? – deceze

+0

@Anigel: Я не активно храню имя клиента и пароль сам в cookie. Но я храню их в сеансе.Я вижу, что сеанс создает файл cookie, который длится до тех пор, пока в следующий раз браузер будет открыт, когда все куки будут удалены. Скажите, пожалуйста, если это все еще небезопасно. – user2187593

ответ

0

Прежде всего: do не сохранить пароли в cookie! Это очень плохая идея с точки зрения безопасности.

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

Полезные функции:

explode

array-merge

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