وردپرس (wordpress)

Session چیست و چه مزایا و معایبی دارد؟

در پاسخ به session چیست بایستی گفت وب سایت ها state less هستند. به این معنی که هربار صفحه ای به سمت سرور ارسال می شود، یک نمونه ی جدید از این صفحه ساخته می شود و اطلاعات فعلی این صفحه از بین می رود. همچنین پروتکل http نیز یک پروتکل state less  است و نمی تواند اطلاعات یک کلاینت را روی صفحه ذخیره کند. اگر کاربر بعضی از اطلاعات را درج کند و به صفحه ی بعد حرکت کند، داده های این صفحه از دست می رود و کاربر ممکن است نتواند این اطلاعات را برگرداند. با توجه به مطالبی که گفته شد ما به مکانی برای ذخیره اطلاعات نیازمندیم، session امکاناتی را فراهم می آورد تا بتوان اطلاعات را در حافظه ی سرور ذخیره کرد. به ازای هر کلاینت داده های session به صورت مجزا ذخیره می شود.

به زبان ساده session چیست؟

درواقع session مدت زمانی است که کاربر با یک صفحه ی سایت در تعامل است و درواقع از دید برنامه نویسی session state فقط یک حافظه است که به صورت یک دیکشنری یا hash table است و هر ردیف این جدول یک زوج مرتب key _ value است که به راحتی می توان اطلاعات را درون session ریخت یا اطلاعات کاربر را از آن خواند.

مزیت سشن چیست؟

  • session وضعیت های یک کاربر را در سراسر application نگه می دارد.
  • پیاده سازی session آسان است وبه راحتی میتوان انواع object ها را ذخیره کرد.
  • به ازای هر کلاینت داده ها به صورت مجزا ذخیره می کند.

 

session، راه حلی برای انتقال متغیرها و داده از یک صفحه به صفحه

مدیریت session state یکی از ویژگی های برجسته ASP.NET است که به کمک آن می توان هر نوع داده ای را در حافظه سرویس دهنده ذخیره کرد. بدین ترتیب، یک سطح حفاظتی مطلوب در خصوص داده ایجاد خواهد شد، چرا که اطلاعات برای سرویس گیرنده ارسال نخواهند شد و برای هر جلسه کاری منحصر بفرد می باشند.

هر سرویس گیرنده ای که به برنامه دستیابی داشته باشد دارای یک session متفاوت و مجموعه ای از اطلاعات متمایز و مختص به خود است. session state برای ذخیره اطلاعاتی نظیر آیتم های خریداری شده توسط کاربر از یک سایت و استقرار آنها در سبد خرید در زمان حرکت از یک صفحه به صفحه دیگر بسیار مفید و موثر واقع می شود.

با استفاده از session state می توان اطلاعات مورد نظر را از طریق یک صفحه ذخیره و در سایر صفحات از آنها استفاده کرد.

با این که session state بسیاری از مشکلات در ارتباط با سایر روش های مدیریت state را برطرف نموده است ولی خود نیز دارای چالش های مختص به خود است. به عنوان مثال ، با بکارگیری روش فوق در برنامه های وب ، سرویس دهنده وب ملزم به ذخیره اطلاعات بیشتری در حافظه سرویس دهنده خواهد شد.  این موضوع می تواند همزمان با افزایش کاربران یک برنامه بر روی کارایی آن تاثیر بگذارد. چراکه درصد استفاده از یک منبع محدود ( حافظه ) افزایش خواهد یافت.  بنابراین ، لازم است استفاده از session state  با دقت و بررسی تمامی جوانب کار صورت پذیرد.

سشن در asp.net

معماری session

مدیریت session به عنوان بخشی از استاندارد HTTP محسوب نمی گردد. بنابراین لازم است که ASP.NET عملیات بیشتری را به منظور پیگیری اطلاعات session انجام دهد.

ASP.NET هر session را از طریق یک شناسه ۱۲۰ بیتی منحصربفرد پیگیری و از یک الگوریتم اختصاصی برای تولید آن استفاده می نماید.  بنابراین حداقل این تضمین از لحاظ تئوری ایجاد می گردد که عدد تولید شده منحصر بفرد بوده و به اندازه کافی تصادفی است ، تا امکان و یا احتمال تشخیص و حدس آن توسط مهاجمان به حداقل مقدار خود برسد.

شناسه ، تنها اطلاعات مبادله شده بین سرویس دهنده وب و سرویس گیرنده است. زمانی که سرویس گیرنده شناسه session خود را ارائه می نماید ، ASP.NET در اولین اقدام جستجو جهت یافتن session متناظر با آن را انجام می دهد. در صورتی که ماحصل فرآیند فوق مثبت باشد ، داده از state server بازیابی و به اشیاء مورد نظر تبدیل می گردد. در ادامه ، اشیاء فوق در یک مجموعه خاص استقرار می گردند تا امکان دستیابی به آنها از طریق کد وجود داشته باشد. فرآیند فوق بطور اتوماتیک انجام می شود.

شاید برای شما این سوال مطرح شده باشد که ASP.NET ، اطلاعات مربوط به session را در چه مکانی ذخیره و چگونه آنها را serialize و deserialize می نماید؟ در  ASP کلاسیک ، session state به عنوان یک شی COM پیاده سازی شده است که در کتابخانه asp.dll مستقر می گردد. در ASP.NET ، اینترفیس برنامه نویسی تقریباً یکسان است ولی نحوه پیاده سازی آن با ASP کلاسیک کاملاً متفاوت است.

زمانی که ASP.NET یک درخواست HTTP را بررسی می نماید ، آن را از طریق مجموعه ای از ماژول های مختلف که قادر به واکنش در خصوص رویدادهای برنامه می باشند ، به حرکت در می آورد. SessionStateModule ، یکی از ماژول های موجود در این زنجیره است ( موجود در namespace با نام  System.Web.SessionState ) . ماژول فوق شناسه session را تولید ، داده session را از ارائه دهندگان خارجی state بازیابی و داده را  به درخواست مورد نظر نسبت می دهد. همچنین ماژول فوق ، اطلاعات مربوط به session را پس از اتمام پردازش صفحه ، ذخیره می نماید.

توجه داشته باشید که ماژول SessionStateModule عملاً داده session را ذخیره نمی نماید. در واقع ، داده session در عناصر مجزاء نگهداری می گردد که به آنها state provider می گویند.

مشکل session

در حالتی که حجم زیادی از کاربران روی سایت باشند چون داده های سشن درون حافظه ی سرور است باعث میشود کارایی سایت پایین بیاید.

ذخیره کردن مقادیر و بازیابی آن از session 

عمل ذخیره و بازیابی مقادیر در سشن کاملا شبیه به view state است ومیتوان از طریق  System.Web.SessiontState.HttpSessionState با session ها ارتباط برقرار کرد چون کلاس پیاده سازی session در asp.net را فراهم می کند. کدهای زیر برای ذخیره و بازیابی مقادیر درون session  مورد استفاده قرار میگیرد.

   // Sessionذخیره کردن مقادیر در

       Session[“UserName”] = txtUser.Text;

// sessionچک کردن مقادیر در  

        if (Session[“UserName”] != null)

        {

            // Sessionبازیابی مقادیر از

            lblWelcome.Text = “Welcome : ” + Session[“UserName”];

        }

شما میتوانید حتی یک object را درون  session ذخیره کنید مانند زیر:

//Sessionذخیره کردن مقادیر در

        Session[“DataSet”] = _objDataSet;

       // sessionچک کردن مقادیر

        if (Session[“DataSet”] != null)

        {

        //Sessionبازیابی مقادیر از

            DataSet _MyDs = (DataSet)Session[“DataSet”];

        }

 فعال و غیر فعال کردن Sessionها

برای کارایی بهینه تر میتوان یک Session را فعال یا غیر فعال کرد چون وجود Session در تمام صفحات ممکن است باعث افزایش سربار و کاهش کارایی شود، بنابراین بهتر است به جای اینکه یک Session همیشه فعال باشد، فقط در صفحه هایی  که به آن نیاز است یک Session را فعال کنیم. به دو روش می توان Session را فعال کرد.

۱.page_level: از این طریق می توان Session در یک صفحه ی خاص را با استفاده ازصفت  EnableSessionState فعال یا غیر فعال کرد مانند شکل زیر:

در این روش فعالیت های  Session برای یک صفحه خاص غیر فعال است و حتی می توان  Sessionرا به صورت Readonly  در آورد و صفحه ای که  Session آن به صورت  ReadOnly است فقط این اجازه را می دهد تا به داده های  Session دسترسی داشت و نمی توان آن را دستکاری کرد.

۲. ApplicationLevel: در این روش  SessionState می تواند برای سراسرWebApplication  فعال یا غیر فعال شود و این کار با استفاده ازEnableSessionState  درون Web.Config  انجام می شود.

<system.web>

  <!- – Disabled Session Application Level – – >

  <pages enablesessionstate=”false” />

</system.web>

توصیه می شود که از PageLevel برای فعال و غیر فعال کردن Session استفاده کنید چون ممکن است، فقط بعضی از صفحات به Session نیاز داشته باشند.

SessionState یعنی همه ی تنظیماتی که ما برای نگه داری Session درون سایتمان انجام می دهیم،  و SessionState یک مبحث مهم است که تمام تنظیمات مربوط به پیکره بندی Session  را بیان می کند.

پیکربندی session در web.config

اگر تنظیمات مربوط به session را در فایل web.config  ی که مربوط به این وب سایت است انجام دهید تنظیمات فقط به این پروژه اعمال می شود اما اگر تنظیمات مربوط به session  را در web.config ی که به آن فایل پیکر بندی ماشین می گویند انجام دهید این تنظیمات به کل سایت هایی که بر روی این کامپیوتر هستند اعمال می شود.

SessionID:  asp.netاز یک شناسه ی ۱۲۰ بیتی برای ذخیره هر  sessionاستفاده می کند و زمانی که کلاینت ( اگر نمی دانید کلاینت چیست در مقاله ی دیگری در این باره توضیح داده ایم.) داده ای را درخواست می کند asp.net به sessionID نگاه می کند و داده های مرتبط با این SessionID را بر می گرداند و مراحل این کار در زیر توضیح داده شده است:

۱. ابتدا کلاینت به سایت مراجعه می کند وبعضی از اطلاعات این کلاینت درون session ذخیره میشود.

۲. سرور یک شناسه منحصربه فرد برای کلاینت می سازد وسپس اطلاعات را درون  session state  provider ذخیره می کند .

۳. دوباره کلاینت بعضی از اطلاعات را درخواست می کند, serverبا استفاده از session_id  اطلاعات را ازsessionprvider  برمی گرداند و به object تبدیل می کند.

Session Event

ابتدا بیایید نگاه مختصری به SessionEvent بیندازیم ۲ نوع رویداد مربوط به Session ها درون asp.net وجود دارد و عبارتند از:

  • Session_start
  • Session_End

شما می توانید این ۲رویداد را دستکاری کنید  و برای آنها دستوراتی درون فایل global.asax  تنظیم کنید و زمانی که یک Session مقدار دهی اولیه می شود رویداد Session_start اجرا می شود. رویداد Session_End زمانی اجرا میشود که مدت زمان اعتبار Session به اتمام رسیده باشد و یا کاربر Signout شود و صفحه را ترک کند.

void Session_Start(object sender, EventArgs e)

    {

        دستورات مربوط به زمانی که Sessionجدید مقدار دهی میشود

    }

    void Session_End(object sender, EventArgs e)

    {

          دستورات مروط به اتمام Session

        }  

در asp.net حالت های زیر برای یک session قابل دسترس است:

  • InProc
  • StateServer
  • SqlServer
  • Custom

تصویر بالا بیانگر این است که براساس SessionState ای که انتخاب می شود یک SessionStateProvider  انتخاب می شود و زمانی که Asp.net  اطلاعاتی را برمبنای SessionId درخواست میکند، با توجه به نوع session، sessionProvider متناظر با آن مسئول فرستادن اطلاعات مربوط به این session است.

 حالت دیگری به نام “OFF” نیز وجود دارد که در صورت انتخاب این گزینه Session برای application غیر فعال می شود با توجه به اینکه هدف از این مقاله  استفاده از Session است به ۴حالت SessionState نگاهی می اندازیم:

از المنت <sessionstate> درون فایل WebConig برای پیکره بندی Session استفاده می شود. بعضی از این خصوصیات که در تگ <sessionstate> استفاده می شود عبارتنداز: Mode,timeout,sqlConnectionString وCustemProvier .

 انواع SessionMode ها

الف-   InprocSessionMode

درون asp.net به طور پیش فرض مقدار خاصیت Mode برایر inproc است و زمانی که این حالت فعال است، اطلاعات Session بر روی حافظه ی همین سرور که برنامه  اجرا می شود، ذخیره می شود. این بهترین حالتی است که کارایی webApplication را بالا می برد چون داده ها بر روی حافظه ی سیستم جاری ذخیره می شود، اطلاعات به سرعت قابل دسترسی است.

چون داده های Session  در حافظه یapplication   جاری است بنابراین با ریست کردن  server داده ها گم می شود که این موضوع بزرگترین عیب Inproc  محسوب می شود. اگر کلاینتی درخواست  داده های خاصی را بدهد،StateProvider  داده ها را از حافظه می خواند و به کلاینت برمی گرداند و باید درون فایل Web.Config ،  SessionModeرا نوشته و علاوه بر آن خاصیت TimeOut  را نیز تنظیم کرد.

<system.web>

    <- –  InProc Session In Application – – >

 <sessionstate  mode=”InProc”  timeout=”۳۰″ />

</system.web>

TimeOut به این معناست که این Session  تا چند دقیقه دیگر اطلاعات را درخود نگه میدارد که این خصوصیت را درون کدها  C# نیز میتوان به صورت زیر نیزتنظیم کرد:

Session.TimeOut=30;

چه زمان هایی از Inproc استفاده می کنیم؟

چون Inproce داده ها را درون Application جاری ذخیره می کند، برای سایت های کوچک و جاهایی که تعداد کاربران خیلی کم است مفید است.

مزیت ها ی Inproc

  1. داده های Session را درون حافظه ی برنامه ی جاری ذخیره می کند و بنابراین دستیابی به  داده ها سریع است.
  2. نیاز به Serialization برای ذخیره داده ها درون حافظه نیست.
  3.  پیاده سازی آن خیلی آسان است و شبیه به استفاده از ViewState است.

معایب Inproc

هرچند  Inproc سریع ترین و عمومی ترین مکانیسم است اما محدودیت هایی دارد.

۱. اگر در زمانی که وضعیت Session برابر Inproc است WorkerProcess،ApplicationDomain ، ریست شود تمام اطلاعات گم می شود.

۲. هرچند سریع ترین روش است اما زیاد بودن کاربران و داده های Session روی کارایی آن تاثیر می گذارد بنابراین از این حالت نمی توان در سناریوهای WebGadren استفاده کرد.

ب-  StateServerSessionMode

این روش اغلب outProc نامیده می شود، StateServer از یک WindowsService که مستقل از IIS است  استفاده می کند وداده های Session بر روی سرور مجزا ذخیره میشود که مستقل از  IISاست بنابراین درصورت Reset شدن سرور اطلاعات پاک نمی شود.SessionState  به طور کامل توسط Aspnet-State.exe مدیریت می شود.

برای  استفاده از webService باید درون CommandPrompt دستور زیر را تایپ کنید:

net start aspstate

 حال نگاهی به پیکره بندی Web.config و تنظیمات StateServer می اندازیم ابتدا باید خصوصیت StateConnectionString را تنظیم کرد تا سیستمی که   StateServerرا اجرا می کند مشخص شود. به طور پیش فرض ConnectionString از IP با مقدار ۱۲۷.۰.۰.۱(یعنی کامپیوتر فعلی ) و پورت شماره ۴۲۴۲۴ استفاده می کند.

<configuration>

  <sessionstate   mode=”stateserver”

      cookieless=”false”

      timeout=”۲۰″

          sqlconnectionstring=”data source=127.0.0.1;user id=<user id>;password=<password>”

      server=”۱۲۷.۰.۰.۱″

      port=”۴۲۴۲۴″   />

</configuration>

خصوصیت StateNetworkTimeDate نیز حداکثرثانیه ای است که برای پاسخ سرویس منتظرمی ماند و مقدار آن به طور پیش فرض ۱۰است.

چگونه یک StateServer کارمی کند؟

از StateServer برای جلوگیری از گم شدن داده ها در زمان reset شدن Server استفاده می شود و stateServer توسط پروسه ی  aspnet_state.exe که به عنوان یکWindowsService  شناخته می شود، دستکاری می شود و این پروسه تمام داده هایSession را دستکاری می کند اما نیاز است تا داده ها قبل از ذخیره شدن  درون StateServer، Serialize شوند.

همانطور که در شکل بالا نشان داده شده است کلاینت ها درخواست خود را به WebServer می دهند و سپس سرور داده های session رابر روی StateServer ذخیره میکند. که StateServer ممکن است سیستم جاری باشد یا سیستمی دیگر که  کاملا مستقل ازIIS  است و محلی که StateServer روی آن قرار میگرد به خصوصیت StateConnectionString  وابسته است.

 برای تغییر محل StateServer ابتدا IP را تغییر دهید و مطمئن شوید که AspNet_State.exe  برروی آن انجام می شود در غیر این صورت زمانی که شما تلاش می کنید داده ها را درون  Sessionذخیره کنید خطای زیر به شما نشان داده می شود.

زمانی که شما می خواهید داده ای را درون Session ذخیره کنید داده ها شما توسط  StateProvider درون  StateServerذخیره می شوند و در زمان بازگشت داده ها، StateProvider داده ها را از StateServer باز میگرداند.

بیشتر بخوانید:  session hijacking چیست

مزیت ها و مشکلات این روش

مزیت ها :داده ها را مجزا از IIS نگه میدارد و این باعث می شود تا هر موضوعی در رابطه با IIS اختلالی درون SessionState ایجاد نکند و این روش برای WebGarden ها مناسب است.

مشکلات: StateServer همیشه باید ابتدا کاملاload  شود و سپس اجرا شود و همچنین عمل Serialization و desrialization به کندی صورت می گیرد.

ج-   SqlServerSessionMode

این  Sessionبرای شما امنیت و اعتماد بیشتر در مدیریت Sessionها درون  asp.netدارد و دراین روش نیز داده ها ابتدا به صورت Serialization درون پایگاه داده ها ذخیره می شود.

پیکره بندی SqlServerSessionMode

درون SqlServerSessionMode داده های  Sessionدرون  SqlServer ذخیره می شود بنابراین باید یک ConectionString برای dateBase، درون web.conig ایجاد شود. بعداز این کار باید  SqlServerرا پیکره بندی کرد و در اینجا نحوه ی پیکره بندی sqlserver با استفاده از دستور aspnet_regsql شرح داده می شود.

از درون CommandPrompt به پوشه ی نسخه فعلی Framework رفته و دستور  aspnet_regSql را اجرا کنید.

حال برنامه  sqlServer را باز کنید و مشاهده می کنید که یک پایگاه داده به نام AspState ایجادشده که دارای ۲جدول به نام های aspStateTempApplication و AspStateTempSessionاست و داده های Session  شما درون جدول  AspStateTempSession قرار می گیرد.

چه زمانی از Sql Server Session Mode استفاده می شود؟

  1.  این روش امن ترین روش برای مدیریت SessionState است .
  2. داده ها را درون یک پایگاه داده متمرکز نگه می دارد.
  3.  زمانهایی که به طور متوالی server شما  Resetمی شود از این روش استفاده کنید.
  4. این روش مناسب webGaren ها نیز است.
  5. زمانی که می خواهید  Sessionرا بین ۲ نوع متفاوت application به اشتراک گذارید از این روش استفاده کنید.

مشکلات:

۱. سریال کردن اطلاعات باعث ایجاد سربار بر روی application می شود.

۲. از آنجایی که Session همیشه توسط server های متفاوت اجرا و یا دستکاری می شود باید مواظب باشیدتا SqlServer همیشه در حال اجرا باشد.

د- CustomSessionMode

با اینکه عموما از SessionModeهای SqlServer ,Inproc ,StateServer استفاده می شود اما نیاز است تا درباره اساس CustomSession مطالبی بدانیم، CustomSessionMode خیلی جذاب است زیرا کنترل کامل بر روی  Sessionرا به شما می دهد و حتی می توانید الگوریتمی را برا ی تولید SessionId بنویسید. شما میتوانید با استفاده از کلاس پایه ی SessionStateStoreProviderBase  یک CustomProvider را پیاده سازی کنید تا داده های  Sessionرا به روش های دیگر ذخیره سازی کند و همچنین می توانید یک SessionID جدید را به وسیله پیاده سازی یک Interface به نام SessionIDManager تولید کنید. درشکل زیر متدهایی را که در زمان پیاده سازی customSession  صدا زده می شود را مشاهده می کنید.

 ۱.درون متد Initialize شما می توانید CustomProvider را تنظیم کنید واین متد connection و Provider مربوط به آنرا مقداردهی اولیه می کند.

۲.متد SetItemExpireCallbackبرای تنظیم کردن SessionTimeOut استفاده می شود و می توان هریک از متدهایی را که در زمان  SessionExpireصدا زده می شوند را رجیستر کرد.

۳.متد InitializeRequest برای هر درخواستی صدا زده می شود و از متد CreateNewStoreDate برای ساختن یک نمونه ی جدید از SessionStateStoreData استفاده می کند.

چه زمان هایی از CustomSessionMode استفاده می شود؟

۱. زمانی که میخواهید داده های Session را درجایی جدا از SqlServer ذخیره کنید.

۲. زمانی که مجبور هستید از جدول های موجود برای ذخیره SessionDate استفاده کنید.

۳. زمانی که نیاز دارید تا SessionID هایی مخصوص برای خودتان بسازید.

پیکره بندی CustomSessionMode:

<sessionstate mode =”custom” costomProvider  =”AccessProvider”>

     <providers >

         <add name  =”accessProvider” type =”CustomDataType”/>

     </providers>

</sessionstate>

مزیت های CustomSessionMode

۱. به وسیله ی این روش شما می توانید از بعضی از جدول های موجود در سیستمتان برای ذخیره ی داده های  Sessionاستفاده کرد و این برای زمانی مناسب است که شما مجبورید از DataBaseهای قدیمی به جای SqlServer استفاده کنید.

۲. این روش وابسته به IIS نیست بنابراین Reset کردن سرور تاثیری بر روی داده های Session نمی گذارد.

۳. شما با این روش می توانید الگوریتم هایی برای تولید SessionID بنویسید.

مشکلات CustomSessionMode

۱. پردازش داده ها بسیار کند است.

۲. ساختن provider برای CustomState یک کار خیلی سطح پایین است که نیازبه دقت خیلی زیادی دارد تا از امنیت آن مطمئن شوید.

بیشتر پیشنهاد می شود که از سه حالت قبلی استفاده کنید تا اینکه خودتان یک Provider بسازید.

سوالات متداول

وب سایت ها state less هستند، به این معنی که هربار صفحه ای به سمت سرور ارسال می شود یک نمونه ی جدید از این صفحه ساخته می شود و اطلاعات فعلی این صفحه از بین می رود همچنین پروتکل http نیز یک پروتکل state less  است و نمی تواند اطلاعات یک کلاینت را روی صفحه ذخیره کند و اگر کاربر بعضی از اطلاعات را درج کند و به صفحه ی بعد حرکت کند، داده های این صفحه از دست می رود و کاربر ممکن است نتواند این اطلاعات را برگرداند. با توجه به مطالبی که گفته شد ما به مکانی برای ذخیره اطلاعات نیازمندیم، session امکاناتی را فراهم می آورد تا بتوان اطلاعات را در حافظه ی سرور ذخیره کرد. به ازای هر کلاینت داده های session به صورت مجزا ذخیره می شود. 
۱-session وضعیت های یک کاربر را در سراسر application نگه می دارد. ۲-پیاده سازی session آسان است وبه راحتی میتوان انواع object ها را ذخیره کرد. ۳-به ازای هر کلاینت داده ها به صورت مجزا ذخیره می کند.
در حالتی که حجم زیادی از کاربران روی سایت باشند چون داده های session درون حافظه ی سرور است باعث میشود کارایی سایت پایین بیاید.

ایران هاست

مشخصات مدیر

‫۲ دیدگاه ها

  1. با سلام. من خودم شخصا خیلی دنبال این بودم که چطوری session های داخل اسکویل رو پاک کنم. این مقاله http://ably.ir/Post/3752/sql-server-script-to-kill-inactive-sessions-kill-sleeping-sessions-from-sp-who2/-1 واسه من جالب بود و راحت کارمو راه انداخت. خواستم به دوستان هم معرفی کنم. با تشکر

دیدگاهتان را بنویسید

نوشته های مشابه

دکمه بازگشت به بالا