عنوان
|
نويسنده
|
مشاهده
|
تعداد
آراء |
امتياز
|
State Management در ASP. NET 2.0 (بخش دهم) |
مديريت وب |
16060 |
377 |
3.1 |
با توجه به جایگاه داده در عصر حاضر و لزوم نگاه جامع به این مقوله مهم ، بر آن شدیم تا محوریت فعالیت های خود را بر روی این موضوع متمرکز نمائیم . از این رو گروه فابک با شعار فناوری اطلاعات برای کسب وکار شکل گرفت و خدمات خود را از طریق سایت www.fabak.ir به مخاطبان محترم عرضه می نماید
 |
State Management در ASP. NET 2.0
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 خواهيم پرداخت .