Я создал usercontrol, который я использую в своем приложении для автоматического выхода из системы по истечении времени ожидания сеанса. Для этого я использую переменную cookie. Мне нужно сбросить переменную cookie, как только происходит обратная передача, поскольку это означает, что пользователь активен. Следующий бит кода устанавливает время истечения, которое будет сохранено в «экспресс» cookie

DateTime date = DateTime.Now;
LoginDate = date.ToString("u", DateTimeFormatInfo.InvariantInfo).Replace("Z","");
int sessionTimeout = Session.Timeout;
dateExpress = date.AddMinutes(sessionTimeout);
ExpressDate = dateExpress.ToString("u", DateTimeFormatInfo.InvariantInfo).Replace("Z", "");

HttpCookie cookie = Request.Cookies["express"];
if (cookie == null)
{
  cookie = new HttpCookie("express");
  cookie.Path = "/somepath/";
  cookie.Values["express"] = ExpressDate;
}
else
{
  cookie.Values["express"] = ExpressDate;
}

Я использую следующий код JavaScript для получения набора файлов cookie со стороны сервера в таймере на стороне клиента, который постоянно проверяет, истек ли сеанс

<script type="text/javascript">
var timeRefresh;
var timeInterval;
var currentTime;
var expressTime;

expressTime = "<%=ExpressDate %>";
currentTime = "<%=LoginDate %>";
//setCookie("express", expressTime);
timeRefresh = setInterval("Refresh()", 10000);

// Refresh this page to check session is expire or timeout.
function Refresh() {

var current = getCookie("express");
alert(current);
}

// Retrieve cookie by name.
function getCookie(name) {
    var arg = name + "=";
    var aLen = arg.length;
    var cLen = document.cookie.length;
    var i = 0;
    while (i < cLen) {
        var j = i + aLen;
        if (document.cookie.substring(i, j) == arg) {
            return getCookieVal(j);
        }
        i = document.cookie.indexOf(" ", i) + 1;
        if (i == 0) break;
    }
    return;
}

function getCookieVal(offSet) {
    var endStr = document.cookie.indexOf(";", offSet);
    if (endStr == -1) {
        endStr = document.cookie.length;
    }
    return unescape(document.cookie.substring(offSet, endStr));
}

Но я всегда получаю неопределенное значение для cookie со стороны клиента.

PS: я также попытался использовать переменную сеанса, созданную на стороне сервера, и получить к ней доступ из javascript, но даже если он читает значение сеанса, он читает только первое значение, назначенное при загрузке страницы, где я хочу получить значение сеанса при следующей обратной передаче

Я устанавливаю сеанс экспресс в странице загрузки ()

 Session["express"] = ExpressDate;

Затем попытался получить доступ к нему из JavaScript, как это

function Refresh()`
{
var current = '<%=Session["expiry"].ToString()%>'
alert(current) // This always return the first value assigned during page load
}`

Любая помощь высоко ценится

1
Pissu Pusa 13 Янв 2017 в 09:44

3 ответа

Лучший ответ

Обнаружен недостающий фрагмент. Джаганатх правильно указал путь к '/'

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

Это то, что я сделал

HttpCookie cookie = HttpContext.Current.Request.Cookies["express"];

    if (cookie == null)
    {
        cookie = new HttpCookie("express");
    }
    cookie.HttpOnly = false;
    cookie.Path = "/";
    cookie.Values["express"] = ExpressDate;
    Response.Cookies.Add(cookie);

Спасибо всем

0
Community 23 Май 2017 в 10:29

Я подозреваю, что path может создать проблему. Когда для path установлено значение /somepath/, файлы cookie могут быть доступны на стороне клиента только по запросам, которые имеют /somepath/.

Например,

Вы запрашиваете страницу http://example.com/somepath/login и устанавливаете файлы cookie на сервере со значением пути /somepath/login.

В следующий раз вы запрашиваете страницу http://example.com/otherpath/done и пытаетесь получить доступ к cookie на стороне клиента. Поскольку вы устанавливаете файлы cookie по пути /somepath/login на сервере, вы не получите эти файлы cookie с этим запросом.

Поэтому убедитесь, что вы установили правильный путь для файлов cookie или не устанавливайте его так, чтобы он становился /, и файлы cookie, установленные по этому пути, будут доступны во всех запросах в одном домене http://example.com.

1
Thaadikkaaran 13 Янв 2017 в 07:09

У вас есть 2 вида куки, только сервер или оба.

HttpCookie имеет свойство HttpOnly. Просто установите значение false.

Получает или задает значение, указывающее, доступен ли файл cookie клиентским сценарием.

cookie.HttpOnly = false; //default value

< Сильный > ИЗМЕНИТЬ Простой способ отладки - заглянуть в консоль разработчика и сравнить ее с вашей строкой.

enter image description here

1
Vlad Teodor 13 Янв 2017 в 07:06