SessionId изменяется при перезапуске браузера [duplicate]

В JDK1.8 вы можете использовать агрегированные операции и выражение лямбда:

String[] strArray = new String[] {"John", "Mary", "Bob"};

// #1
Arrays.asList(strArray).stream().forEach(s -> System.out.println(s));

// #2
Stream.of(strArray).forEach(System.out::println);

// #3
Arrays.stream(strArray).forEach(System.out::println);

/* output:
John
Mary
Bob
*/
3
задан Amitabh 24 July 2013 в 14:34
поделиться

2 ответа

Вы не можете восстановить идентификатор сеанса как таковой, но вы можете, конечно, восстановить часть предсказуемой части состояния сеанса. Если вы используете проверку подлинности с помощью форм, просто прочитайте файл cookie forms-auth в файле global.asax session start и повторно заселите объекты сеанса.

Вы можете управлять истечением срока действия cookie-файлов для проверки подлинности форм, создавая постоянный файл cookie с помощью:

FormsAuthentication.SetAuthCookie(userName, true)

В качестве альтернативы вы можете точно настроить истечение, вручную изменив файл cookie:

Dim authCookie As HttpCookie = FormsAuthentication.GetAuthCookie(userName)
Dim authTicket As FormsAuthenticationTicket = FormsAuthentication.Decrypt(authCookie.Value)
Dim newAuthTicket As New FormsAuthenticationTicket(authTicket.Version, authTicket.Name, authTicket.IssueDate, expireDate, authTicket.IsPersistent, userData)
authCookie.Value = FormsAuthentication.Encrypt(newAuthTicket)
authCookie.Expires = newAuthTicket.Expiration
HttpContext.Current.Response.Cookies.Set(authCookie)

Где expireDate указывает, когда файл cookie должен истекают.

Теперь в global.asax session start вы можете проверить, не будет ли возвращаемый пользователь еще аутентифицирован (в силу установленного ранее сохраненного файла cookie):

If HttpContext.Current.User.Identity.IsAuthenticated Then
    ' Here re-populate the predictable part of session state
    ' Like user profile etc.
End If

Добавлено после получения информации о Op:

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

В таком случае единственным вариантом является сохранение существующего сеанса с помощью постоянного файла cookie , так что вы можете получить его позже. Для этого есть некоторые обходные пути. Один из обходных путей объясняется здесь автором этого блога:

http://weblogs.asp.net/imranbaloch/archive/2010/06/09/persisting-session-between-different- browser-examples.aspx

Что здесь происходит, так это то, что мы перехватываем два события в global.asax:

  1. PostRequestHandlerExecute: (Происходит, когда Обработчик событий ASP.NET завершает выполнение). В этом обработчике мы создаем новый файл cookie (например, temp ), значение которого присваивается значению текущего SessionId. Мы делаем это постоянным файлом cookie, устанавливая свойство expires на тайм-аут сеанса.
  2. PostMapRequestHandler: (Происходит, когда ASP.NET сопоставил текущий запрос с соответствующим обработчиком событий). В этом обработчике мы проверяем возвращающего пользователя, проверив наличие файла cookie « temp ». Если найдено, мы обновляем фактический файл cookie сеанса (ASP.NET_SessionId) со значением нашего файла cookie temp "; тем самым эффективно восстанавливая предыдущую сессию.

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

4
ответ дан Abhitalks 24 August 2018 в 09:20
поделиться

По крайней мере вы можете получить информацию о сеансе. Это можно сделать легко, если вы установите «Режим» на «SqlServer».

Вы можете запросить базу данных (ASPState) & amp; отсюда следует таблица (ASPStateTempSessions), в которой вы сохраняете свои сеансы. [Я использовал постоянное хранилище: -sstype p]

SELECT TOP 5 [SessionId]
      ,[Created]
      ,[Expires]
      ,[LockDate]
      ,[LockDateLocal]
      ,[LockCookie]
      ,[Timeout]
      ,[Locked]
      ,[SessionItemShort]
      ,[SessionItemLong]
      ,[Flags]
  FROM [ASPState].[dbo].[ASPStateTempSessions]

Даже если вы знаете свой идентификатор сеанса, вы можете использовать его для восстановления предыдущего сеанса. Asp.Net создаст новый SessionID, когда вы сделаете новый запрос.

2
ответ дан R.C 24 August 2018 в 09:20
поделиться
Другие вопросы по тегам:

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