개요:
로그아웃하려면 클릭하세요. 로그인/종료 페이지로만 리디렉션되는 경우 홈페이지 등 브라우저 주소 표시줄에 로그인 후 페이지 주소를 입력하세요. 액세스하기 위해 로그인할 필요가 없다는 것을 알게 될 것입니다. 소위 출구는 안전하지 않습니다.
그럼 어떻게 안전하게 하차하나요?
종료를 클릭한 후 해당 세션이나 쿠키를 삭제하는 것입니다.
세션을 지우는 코드:
Session.Clear(); Session.Abandon();
쿠키를 지우는 올바른 코드(쿠키 이름이 UserInfo라고 가정):
if (Request.Cookies["UserInfo"] != null) { Response.Cookies["UserInfo"].Expires = DateTime.Now.AddDays(-1); }
모든 쿠키를 삭제해야 하는 경우 다음을 트래버스하세요.
for (int i = 0; i <Response.Cookies.Count; i++) { Response.Cookies[i].Expires = DateTime.Now.AddDays(-1); }
쿠키 삭제 오류 코드(쿠키 이름이 UserInfo라고 가정):
if (Request.Cookies["UserInfo"] != null) { Response.Cookies.Remove("UserInfo"); }
이 처리 후에도 쿠키가 여전히 존재하는데 왜 그럴 수 없는지 알 수 있습니다. 삭제될까? .NET의 HttpCookieCollection 구현 소스 코드를 살펴보겠습니다.
public void Remove(string name) { if (this._response != null) { this._response.BeforeCookieCollectionChange(); } this.RemoveCookie(name); if (this._response != null) { this._response.OnCookieCollectionChange(); } }
이 작업은 서버가 데이터를 전송할 때 HttpCookieCollection 컬렉션에서 쿠키를 삭제합니다. 클라이언트 서버가 전송되면 서버 측에서 삭제된 쿠키에 대한 정보가 포함되지 않으며 브라우저는 이를 변경하지 않습니다. (제거 메소드는 서버가 삭제된 쿠키를 클라이언트로 보내는 것을 방지할 뿐입니다.) 이 쿠키를 사용하면 클라이언트 컴퓨터에 남아 있는지 여부는 중요하지 않습니다. 따라서 쿠키를 삭제할 수 없는 상황이 발생합니다.
Response.Cookies.Remove는 필요한 효과를 얻을 수 없는데 왜 Microsoft는 이를 계속 유지합니까? CookieCollection은 ICollection 인터페이스를 구현하기 때문에 romove는 실용적인 가치는 거의 없지만 구현해야 하는 메서드입니다. 컬렉션 romove도 이런 식으로 구현해야 하는데, 마이크로소프트가 MSDN을 작성할 때 설명이 너무 불분명해서 우리가 많은 어려움을 겪었습니다.
다음은 안전한 종료를 위한 여러 가지 방법을 요약한 것입니다.
1) 링크 버튼 및 버튼과 같은 서버 컨트롤을 사용하여 종료합니다.
이 방법이 가장 좋습니다: 직접 서버 컨트롤에 해당하는 이벤트에서 세션이나 쿠키를 지우는 코드를 작성하면 됩니다.
2) Logout와 같은 HTML 태그를 사용하여 종료하세요.
특수 태그 의 경우 다음과 같이 구현할 수 있습니다. 이: < ;a href="logout.aspx">Logout logout.aspx의 Page_Load 이벤트에서 세션 또는 쿠키를 지우는 코드를 작성하면 됩니다.
와 같은 HTML 태그의 경우 HTML 태그의 해당 클라이언트 이벤트에서 Js-Ajax 또는 jQuery-Ajax를 사용하여 일반 핸들러(.ashx)에서 지우기를 작성할 수 있습니다. ) 세션 또는 쿠키 코드로 충분합니다.
와 같은 HTML 태그의 경우 현재 페이지에 Button과 같은 서버 컨트롤을 추가하고 div에 포함시킨 후 숨길 수도 있습니다(참고 : 숨기기는 표시되지 않으며 표시될 수 없습니다. div의 display:none을 설정해야만 달성할 수 있는 Visible=False를 통해 버튼의 서버 이벤트에서 세션 또는 쿠키를 지우는 코드를 작성합니다. HTML 마크의 해당 클라이언트 이벤트에서 Js 또는 jQuery로 호출합니다. Button 컨트롤의 Click 이벤트로 충분합니다(서버 속성 Visible=False를 설정하여 Button을 숨기고 JS에서 호출한 Button 컨트롤의 Click 이벤트 또는 jQuery는 유효하지 않습니다).