2017-01-13 9 views
0

セッションタイムアウトが発生したときにユーザーを自動サインアウトするために、アプリケーション全体で使用しているusercontrolを作成しました。そのために私はクッキー変数を使用しています。 ユーザーがアクティブであることを意味するので、ポストバックが発生すると、cookie変数をリセットする必要があります。次のコードビットは、私があれば継続的にチェックし、クライアント側のタイマーでサーバ側からクッキーのセットを取得するには、次のJavaScriptコードを使用していますJavascriptからサーバーサイドで作成された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; 
} 

「を表現する」クッキーに保存されます有効期限を設定し、セッションは終了しました

<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)); 
} 

しかし、私はいつもクライアント側からクッキーのための未定義の値を得ています。

PS:サーバー側で作成したセッション変数を使って、JavaScriptからアクセスしようとしましたが、セッション値を読み込んでも、セッション値を取得するページの負荷で割り当てられた最初の値しか読み取れませんでした次のポストバック

私は

Session["express"] = ExpressDate; 

は次に、この

function Refresh()` 
{ 
var current = '<%=Session["expiry"].ToString()%>' 
alert(current) // This always return the first value assigned during page load 
}` 
のように、JavaScriptからそれにアクセスしようとしました)(pageloadでセッションExpressを設定しています

どんな助力も大変ありがとうございます。

答えて

0

私はpathが問題を作成するかもしれないと思われます。 path/somepath/に設定すると、クッキーはクライアント側では/somepath/の要求でのみアクセスできます。例えば

、あなたがページhttp://example.com/somepath/loginを要求し、/somepath/loginとして、パス値を持つ複数のサーバーでクッキーを設定している

次回は、http://example.com/otherpath/doneページを再度取得し、クライアント側のCookieにアクセスしようとしています。あなたがサーバ上の/somepath/loginのパスにクッキーを設定したので、あなたはこのリクエストでそれらのクッキーを取得しません。

のすべての要求で、このパスに設定されているCookieが/になるように、Cookieの適切なパスを設定するか設定しないでください。

+0

実際に私はパスを未定義のままにしました。しかしそれでもクライアント側からクッキーを見つけることができません –

+0

パスを ''/'' – Thaadikkaaran

0

2種類のクッキー、サーバーのみ、またはその両方があります。

HttpCookieにはHttpOnlyプロパティがあります。それをfalseに設定するだけです。

クライアントサイドスクリプトによってCookieにアクセスできるかどうかを示す値を取得または設定します。

cookie.HttpOnly = false; //default value 

EDIT デバッグする簡単な方法は、デベロッパーコンソールの内側を見て、あなたの文字列を比較することです。

enter image description here

+0

はFYI、cookie.HttpOnly' 'のデフォルト値は' false'をある

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); 

感謝をしました。 – Thaadikkaaran

+0

@JaganathanBantheswaranそれは問題がフロントエンドかcookie.Path = "/"であることを意味します。 –

0

見つかった欠けている部分。 Jaganath

私は唯一の後に次の要求がポストバック

前に作成したクッキーへのアクセスを取得することをこれは何だと応答に作成されたクッキーを追加する必要がありました「/」へのパスを設定することで正しかったです私はすべての

関連する問題