State Management در ASP. NET 2.0 (بخش دهم)
آنچه تاكنون گفته شده است :
بخش اول |
مفاهيم اوليه |
: |
ضرورت مديريت state در برنامه هاي وب |
بخش دوم |
view state |
: |
نحوه ايمن سازي اطلاعات ذخيره شده در view state |
بخش سوم |
view state |
: |
نحوه نگهداري Member Variables و اشياء سفارشي |
بخش چهارم |
cross-page posting |
: |
انتقال اطلاعات از يك صفحه به صفحه اي ديگر |
بخش پنجم |
cross-page posting |
: |
نحوه دريافت اطلاعات از صفحه مبداء |
بخش ششم |
Query String |
: |
نحوه انتقال اطلاعات بين صفحات |
بخش هفتم |
كوكي هاي سفارشي |
: |
نحوه عملكرد كوكي هاي سفارشي |
بخش هشتم |
Session State |
: |
مفاهيم و معماري session |
بخش نهم |
Session State |
: |
نحوه استفاده از session state |
در اين بخش با نحوه پيكربندي session در برنامه هاي وب آشنا خواهيم شد.
پيكربندي session در برنامه هاي وب
پياده كنندگان برنامه هاي وب براي پيكربندي session state مي توانند از فايل web.config ( موجود در دايركتوري مجازي شامل فايل هاي aspx . ) استفاده نمايند . با استفاده از فايل فوق مي توان گزينه هاي پيشرفته اي نظير timeout و مد session state را پيكربندي كرد . در صورتي كه از ويژوال استوديو براي ايجاد يك برنامه وب استفاده شده باشد ، همزمان با ايجاد پروژه ، بطور اتوماتيك يك فايل web.config نيز ايجاد مي گردد .
كد زير يك نمونه فايل web.config را به همراه مهمترين خصلت هاي تاثيرگذار در پيكربندي session state را نشان مي دهد .
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> ... <sessionState cookieless="UseCookies" cookieName="ASP.NET_SessionId" regenerateExpiredSessionId="false" timeout="20" mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" stateNetworkTimeout="10" sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI" sqlCommandTimeout="30" allowCustomSqlDatabase="false" customProvider="" /> </system.web> </configuration> |
در ادامه به تشريح هر يك از خصلت هاي فوق خواهيم پرداخت .
Cookieless
مقدار خصلت فوق بر اساس شرايط زير تعيين مي گردد .
-
UseCookies : گزينه پيش فرض است و همواره از كوكي استفاده خواهد شد حتي اگر مرورگر و يا دستگاه سرويس گيرنده از آن حمايت نكند و يا آن را غيرفعال كرده باشد . در صورتي كه دستگاه سرويس گيرنده از كوكي حمايت نكند ، اطلاعات session در بين درخواست هاي متوالي گم مي شود . چراكه هر درخواست يك ID جديد را خواهد گرفت .
-
UseUri : از كوكي صرفنظر از قابليت هاي مرورگر و يا دستگاه سرويس گيرنده استفاده نخواهد شد . در چنين مواردي ، شناسه session در يك URL ذخيره مي گردد .
-
UseDeviceProfile : معيار انتخاب ASP. NET جهت استفاده از cookieless session ، بررسي نتايج حاصل از بكارگيري شي BrowserCapabilities است . شي فوق صرفا" پتانسيل هائي را كه دستگاه مورد نظر از آنها حمايت مي نمايد مشخص مي كند ( خود را درگير مواردي نظير غيرفعال كردن كوكي توسط كاربر نمي كند ) .
-
AutoDetect : در اين روش ، در آغاز ASP. NET سعي مي كند تشخيص دهد كه آيا مرورگر از كوكي حمايت مي نمايد . بدين منظور يك كوكي بر روي كامپيوتر سرويس گيرنده ايجاد و در ادامه آن را بازيابي مي نمايد . ماحصل فرآيند فوق مي تواند اين موضوع را به اثبات رساند كه مرورگر از كوكي حمايت مي نمايد ولي توسط كاربر غير فعال شده است ( در چنين مواردي از مد cookieless استفاده مي گردد )
كد زير بر استفاده از مد cookieless تاكيد مي نمايد ( مناسب براي تست ) .
<sessionState cookieless="UseUri" ...="" /> |
در مد cookieless ، شناسه session بطور اتوماتيك درون يك URL قرار مي گيرد . زماني كه ASP. NET يك درخواست را دريافت مي نمايد ، شناسه آن را حذف ، مجموعه session را بازيابي و درخواست دريافتي را براي دايركتوري مورد نظر ارسال مي نمايد .
با توجه به اين كه شناسه session درون URL جاري قرار مي گيرد ، لينك هاي مربوطه نير بطور اتوماتيك قادر به استفاده از شناسه session خواهند بود . به عبارت ديگر ، در صورتي كه كاربر بر روي page1.aspx باشد و بر روي لينك مربوط به page2.aspx كليك نمايد ، لينك مربوطه شامل شناسه session جاري به عنوان بخشي از URL مورد نظر خواهد بود . سناريوي فوق در مواردي كه از متد Response.Redirect به همراه يك URL نسبي استفاده شده باشد نيز صدق مي كند .
Response.Redirect("Page2.aspx") |
مثال
در اين مثال با نحوه استفاده از session آشنا خواهيم شد . بدين منظور از دو صفحه با مد cookieless استفاده شده است ( در فايل web.config مقدار cookieless معادل " UseUri" در نظر گرفته شده است ) . اولين صفحه ( Cookieless1.aspx ) شامل يك كنترل Hyperlink و دو دكمه است . دومين صفحه ( Cookieless1.aspx) ، صفحه اي است كه كاربر پس از كليك بر روي يكي از گزينه هاي موجود به آن هدايت شده و پس از بازيابي session ، اطلاعات در خروجي نمايش داده مي شود .
شكل 1 ، نحوه عملكرد صفحه Cookieless1.aspx را نشان مي دهد .
شكل 1 ، نحوه عملكرد صفحه Cookieless1.aspx
-
لينك به همراه مسير نسبي : خصلت Hyperlink.NavigateUrl از طريق كد مقدار Cookieless1.aspx را مي گيرد. در صورت كليك بر روي لينك فوق ، شناسه session بازيابي و مي توان از اطلاعات session در صفحه جديد ( Cookieless2.aspx) استفاده كرد .
-
تغيير مسير ( مسير نسبي ) : تعيير مسير از طريق كد با مد cookieless نيز كار مي كند ( همانند بكارگيري يك مسير نسبي ) . در مثال فوق از متد Response. Redirect براي هدايت كاربر به صفحه Cookieless2.aspx استفاده شده است . در صورت كليك بر روي دكمه فوق ، شناسه session بازيابي و امكان استفاده از اطلاعات session در صفحه جديد فراهم مي گردد . كد زير نحوه انجام اين كار را نشان مي دهد .
Protected Sub cmdLink_Click(ByVal sender As Object,ByVal As EventArgs) Handles cmdLink.Click Response.Redirect("Cookieless2.aspx") End Sub |
Protected Sub cmdLinkAbsolute_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cmdLinkAbsolute.Click Dim url As String = "http://" & Request.Url.Authority & _ Request.Url.Segments(0) & Request.Url.Segments(1) & "Cookieless2.aspx" Response.Redirect(url) End Sub |
كد صفحات Cookieless1.aspx و Cookieless2.aspx در جداول زير نشان داده شده است .
صفحه Cookieless1.aspx |
<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %>
<script runat="server">
Protected Sub cmdLink_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdLink.Click Response.Redirect("Cookieless2.aspx") End Sub
Protected Sub cmdLinkAbsolute_Click(ByVal sender As Object, ByVal e As System.EventArgs) Dim url As String = "http://" & Request.Url.Authority & Request.Url.Segments(0) &_ Request.Url.Segments(1) & "Cookieless2.aspx" Response.Redirect(url) End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Session("test") = "Test String" End Sub </script>
<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl" > <head id="Head1" runat="server"> <title>تست session </title> </head> <body style="font-family: Tahoma"> <form id="form1" runat="server"> <div> <strong> تست session <br /> </strong> <br /> <asp:HyperLink id="lnkRedirect" runat="server" Width="191px" Height="25px" NavigateUrl="Cookieless2.aspx">لينك به همراه مسير نسبي</asp:HyperLink><br /> <br /> <asp:Button id="cmdLinkAbsolute" runat="server" Width="183px" Text="تغيير مسير(مسير مطلق)" Font-Names="Tahoma" Font-Size="Small" ></asp:Button><br /><br /> <asp:Button id="cmdLink" runat="server" Width="187px" Text="تغيير مسير ( مسير نسبي ) " Font-Names="Tahoma" Font-Size="Small" ></asp:Button> </div> </form> </body> </html> |
صفحه Cookieless2.aspx |
<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %> <script runat="server"> Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Session("test") Is Nothing Then lblInfo.Text = "اطلاعات session موجود نمي باشد" Else lblInfo.Text = "اطلاعات session با موفقيت بازيابي گرديد " & CType(Session("test"), String) End If End Sub
</script> <html xmlns="http://www.w3.org/1999/xhtml" dir="rtl" > <head id="Head1" runat="server"> <title>Untitled Page</title> </head> <body style="font-family: Tahoma"> <form id="form1" runat="server"> <div> <asp:Label ID="lblInfo" runat="server" Font-Bold="True" Font-Names="Tahoma" Font-Size="Small" Height="52px" Style="z-index: 101; left: 488px; position: absolute; top: 25px" Width="353px" ForeColor="#C04000"></asp:Label> </div> </form> </body> </html> |
به صورت پيش فرض ، ASP. NET امكان استفاده مجدد از يك شناسه session را فراهم مي نمايد. مثلا" در صورتي كه درخواستي ايجاد و query string شامل يك session باشد كه مدت زمان اعتبار آن به پايان رسيده باشد ، ASP. NET يك session جديد را ايجاد و از شناسه session استفاده مي نمايد .
مشاهده ناخودآگاه يك شناسه session در يك مكان عمومي نظير نتايج ارائه شده توسط يك موتور جستجو يكي از چالش هاي مهم روش فوق محسوب مي گردد كه ممكن است زمينه دستيابي چندين كاربر به سرويس دهنده با استفاده از شناسه session مشابه را فراهم نمايد .
براي پيشگيري از اين تهديد امنيتي ، مي بايست از خصلت regenerateExpiredSessionId با مقدارtrue استفاده شود ( زماني كه از session با مد cookieless استفاده شده باشد ) . در چنين مواردي ، در صورتي كه يك كاربر با يك شناسه session كه تاريخ اعتبار آن به اتمام رسيده است به سرويس دهنده متصل شده باشد ، يك شناسه session جديد براي وي ايجاد خواهد شد . تنها نكته قابل تامل در اين روش ، از دست دادن مقادير موجود در view sate و داده موجود در فرم است ، چراكه ASP. NET براي حصول اطمينان از اين موضوع كه مرورگر داراي يك شناسه جديد session است ، عمليات redirect را انجام خواهد داد .
در بخش يازدهم به بررسي ساير خصلت هاي تاثير گذار در پيكربندي session خواهيم پرداخت .
برگرفته از سايت سخا روش