2010-03-09 2 views
2

저는 회사의 프로젝트 중 상당수에서 나타난 디자인 패턴을보고 있습니다. 역사적으로 올바르게 기능했지만, 다른 개발자들도이 패턴을 사용하여 세션 손상 가능성을 제기한다고 들었습니다. 스택 오버플로에 대한 다른 .NET 개발자의 통찰력을 찾고 있습니다.이 ASP.NET 세션 액세스 기술은 다중 사용자에게 안전합니까?

기본적으로 클래스는 주로 static 또는 싱글 톤 패턴이며, 주로 개발자가 작성한 내용에 따라 App_Code에 저장됩니다.

이 클래스는 속성을 통해 현재 세션에 대한 액세스를 캡슐화합니다. (클래스가 싱글 일 때이 정적되지 않습니다.)

public static class SessionHelper 
{ 
    public static string SessionValue 
    { 
     get 
     { 
      object o = HttpContext.Current.Session["sessionValueName"]; 
      if (o == null) 
      { 
       // Replace the following with code to store & retrieve 
       // a default value of the appropriate datatype. 
       o = string.Empty; 
       HttpContext.Current.Session["sessionValueName"] = o; 
      } 

      return o.ToString(); // or cast, ensure cast is valid & return. 
     } 
     set 
     { 
      HttpContext.Current.Session["sessionValueName"] = value; 
     } 
    } 

    // Other properties, strongly-typed, as above. 
} 

내가 과거에 웹 사이트의 정적 데이터, 주로 정적 때문에 문제를 보았다

: 이러한 속성 모두의 형태를 취할 데이터는 세션 당 상태를 유지하는 데 사용되었습니다. (예를 들어, 정적으로 선언 된 "사용자 별"코드 숨김 멤버를 보았습니다. 내 코드가 아 닙니다. 내 팀은 그 혼란을 쓴 회사의 정리 대원이었습니다.)

그러나, 이것은 HttpContext.Current.Session에 대한 정적 인 항목 일 뿐이므로 클래스가 Session 속성에 캡슐화 된 것과 근본적으로 다른 것은 아니므로 안전해야합니다. 앞에서 말했듯이,이 패턴을 사용하는 회사는 다른 사이트에서는 전혀 문제가없는 것으로 나타났습니다. 여기에는 꽤 크고 활동적인 사용자베이스가 포함되어 있습니다. 그러나 나는 새로운 관점을 얻고 싶습니다.

잠재적으로 다중 사용자 문제, 경쟁 조건 또는 위의 패턴으로 세션 손상을 일으킬 수있는 다른 결함/결함이 있습니까?

답변

2

이 안전의 특성에 XML의 다큐 멘 테이션 코멘트를 추가하여 세션 항목을 문서화 할 수 있습니다. 일부 정적 속성 또는 정적 클래스를 통해 액세스하는 사실은 완전히 부적절합니다. 그것은 언어 추상화입니다. 세션 공급자는 요청을 올바른 세션에 매핑하는 책임이 있습니다 ...이 경우 버그가 없으면 A-OK입니다.

3

나는 당신이 제시 한 것과 매우 유사한 접근법을 사용하고 있으며 지금까지 어떤 문제도 발견하지 못했습니다.

걱정해야 할 것은 하드 코딩 된 세션 키입니다. 동일한 키가 다른 위치에서 다른 용도로 사용되지 않는다는 것을 결코 확신 할 수 없습니다.

그래서 ASP.NET 세션에서 "내 세션"을 저장하는 데 사용되는 하나의 키만 사용합니다. 모든 세션 데이터는 "내 세션"개체의 일반 속성으로 구현됩니다.

public class MySession 
{ 
    // private constructor 
    private MySession() {} 

    // Gets the current session. 
    public static MySession Current 
    { 
     get 
     { 
     MySession session = 
      (MySession)HttpContext.Current.Session["__MySession__"]; 
     if (session == null) 
     { 
      session = new MySession(); 
      HttpContext.Current.Session["__MySession__"] = session; 
     } 
     return session; 
     } 
    } 

    // **** add your session properties here, e.g like this: 
    public string Property1 { get; set; } 
    public DateTime MyDate { get; set; } 
    public int LoginId { get; set; } 
} 

이 클래스를 저장 ASP.NET 세션에서 자체의 인스턴스와 어떤에서 형태 보증 된 방법으로 세션 속성에 액세스 할 수 있습니다 : 내 접근 방식과 같은 방법


는 여기 클래스, 다음과 같은 예 :

int loginId = MySession.Current.LoginId; 

string property1 = MySession.Current.Property1; 
MySession.Current.Property1 = newValue; 

DateTime myDate = MySession.Current.MyDate; 
MySession.Current.MyDate = DateTime.Now; 

이 방법이 여러 가지 장점 :

  • 많은 유형의 캐스팅에서 사용자를 절약 할 수 있습니다.
  • 응용 프로그램에서 하드 코딩 된 세션 키를 사용할 필요가 없습니다 (예 :세션 [ "은 loginid은"]
  • 당신은 MySession
+0

+1 나는 생각합니다. 우리는 일반적으로 같은 페이지에 있습니다. 나는 이것이 분리 된 클래스라는 것을 분명히하지 못했고 모든 세션 액세스가이 클래스를 통과하기 때문에 하드 코딩 된 키만이 클래스에서 사용됩니다. 내 질문 텍스트를 적절하게 업데이트 할 것입니다. 그러나, 나는 독창적 인 object-in-session 아이디어와 비슷합니다. :) –

+1

흠 ... 나는이 접근법을 정말로 좋아하지 않는다. 즉, 하나의 세션 항목에 액세스 할 때마다 모든 것을 얻거나 설정하고 있다는 뜻입니다. 이것은 세션 공급자에 따라 비용이 많이 드는 작업 일 수 있습니다. – Bryan

+0

@ 브라이언 : 좋은 지적입니다! 그러나 일반적으로 우리는 세션 상태를 가능한 한 작게 유지하려고 노력하며, 20 개의 값을 포함하는 하나의 객체를 얻는 것과 (또는 내 접근법 에서처럼) 5 또는 10 개의 값을 개별적으로 얻는 것의 차이는 크지 않을 것입니다. – M4N