当他浏览我网站中的页面时,我使用 session 来记住登录到我网站的用户。
我使用 AJAX 登录:
<script type="text/javascript">
var url = "SignIn.ashx?username=" + UserName.value + "&password=" + PassWord.value;
xmlRequest_SignIn.open("GET", url);
xmlRequest_SignIn.onreadystatechange = function () { ApplyUpdateSignIn() }
xmlRequest_SignIn.send(null);
</script>
在SignIn.ashx文件中,我使用此代码进行部分登录:
// log in
context.Session["USERNAME"] = UserName.toString();
请注意,我已嵌入 System.Web.SessionState.IRequiresSessionState
对于注销,我使用相同的脚本,在SignOut.ashx文件中我使用此代码注销:
context.Session["USERNAME"] = null;
-> 在我网站的每个页面中,我使用以下条件来检查用户:
<script type="text/javascript">
var url = "checkMember.ashx?";
xmlRequest_checkMember.open("GET", url);
xmlRequest_checkMember.onreadystatechange = function () { ApplyUpdatecheckMember() }
xmlRequest_checkMember.send(null);
</script>
checkMember.ashx:
if( context.Session["USERNAME"] == null )
{
//user didn't logged in yet
}
else
{
//user has been logged in
}
--> 此代码在除 IE 之外的所有浏览器中运行良好!!!(Chrome、Mozilla、Safari、Opera 等浏览器...)
在 IE 中当用户转到另一个页面,或者刷新当前页面时,checkMember.ashx 中的条件返回 true 值,它不记得用户在前一页签名过!!
请注意,在 IE 浏览器中启用了 cookie。
经过大量搜索,我找到了这个解决方案:
<script type="text/javascript">
var auth = "<% = Request.Cookies[FormsAuthentication.FormsCookieName]==null ? string.Empty : Request.Cookies[FormsAuthentication.FormsCookieName].Value %>";
var ASPSESSID = "<%= Session.SessionID %>";
var url = "checkMember.ashx?ASPSESSID=" + ASPSESSID.toString() + "&AUTHID=" + auth.toString();
xmlRequest_checkMember.open("GET", url);
xmlRequest_checkMember.onreadystatechange = function () { ApplyUpdatecheckMember() }
xmlRequest_checkMember.send(null);
</script>
checkMember.ashx:
string session_cookie_name = "ASP.NET_SessionId";
if (context.Request.QueryString["ASPSESSID"].ToString() != null)
{
UpdateCookie(session_cookie_name, context.Request.QueryString["ASPSESSID"].ToString());
}
string auth_cookie_name = FormsAuthentication.FormsCookieName;
if (context.Request.QueryString["AUTHID"].ToString() != null)
{
UpdateCookie(auth_cookie_name, context.Request.QueryString["AUTHID"].ToString());
}
if( context.Session["USERNAME"] == null )
{
//user didn't logged in yet
}
else
{
//user has been logged in
}
更新Cookie:
private void UpdateCookie(string cookie_name, string cookie_value)
{
HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(cookie_name);
if (null == cookie)
{
cookie = new HttpCookie(cookie_name);
}
cookie.Value = cookie_value;
HttpContext.Current.Request.Cookies.Set(cookie);
}
现在这段代码也适用于 IE,
但 !我无法在 IE 中注销!
我提到的问题现在为 signOut !当用户注销然后转到另一个页面时,上面的代码无法理解会话为空并且用户已注销!
我应该怎么办?
请帮我 !