State Management در ASP. NET 2.0 (بخش ششم)
آنچه تاكنون گفته شده است :
بخش اول |
مفاهيم اوليه |
: |
ضرورت مديريت state در برنامه هاي وب |
بخش دوم |
view state |
: |
نحوه ايمن سازي اطلاعات ذخيره شده در view state |
بخش سوم |
view state |
: |
نحوه نگهداري Member Variables و اشياء سفارشي |
بخش چهارم |
cross-page posting |
: |
انتقال اطلاعات از يك صفحه به صفحه اي ديگر |
بخش پنجم |
cross-page posting |
: |
نحوه دريافت اطلاعات از صفحه مبداء |
در اين بخش با نحوه انتقال اطلاعات بين صفحات با استفاده از روش Query String آشنا خواهيم شد .
Query String
يكي ديگر از روش هاي ارسال اطلاعات بين صفحات ، استفاده از يك query string در URL است . از رويكرد فوق در موتورهاي جستجو استفاده مي گردد . مثلا" در صورت استفاده از موتور جستجوي گوگل ، پس از درج كليد واژه مورد نظر به يك URL جديد كه با پارامترهاي جستجو تركيب مي گردد ، هدايت مي شويم.
http://www.google.com/search?q=web application+ASP.NET |
query string ، به عنوان بخشي از URL محسوب مي گردد و پس از علامت سوال آورده مي شود . در مثال فوق ، يك متغير با نام q و مقدار web application +ASP. NET تعريف مي گردد .
يكي از مهمترين مزاياي query string ، عدم تحميل عمليات اضافه به سرويس دهنده است . علي رغم مزيت فوق ، رويكرد فوق داراي محدوديت هاي متعددي است كه به برخي از آنها اشاره مي گردد :
-
اطلاعات محدود به رشته هاي ساده مشتمل بر كاراكترهاي مجاز URL است .
-
اطلاعات توسط كاربران قابل مشاهده بوده و هر شخص علاقه مند مي تواند آنها را استراق سمع نمايد .
-
كاربران ماهر مي توانند محتويات query string را تغيير داده و وضعيتي را ايجاد نمايند كه برنامه قادر به واكنش مناسب با آن نباشد ( ايجاد شرايط غيرقابل پيش بيني )
-
تعداد زيادي از مرورگرها داراي محدوديت طول يك URL مي باشند ( معمولا" بين يك تا دو كيلو بايت ) . بنابراين ، نمي توان حجم بالائي از اطلاعات را در query string ذخيره كرد و اين اطمينان را داشت كه اكثر مرورگرها بتوانند از آن استفاده نمايند ( به دليل عدم سازگاري ) .
علي رغم محدوديت هاي اشاره شده ، query string همچنان به عنوان مكانيزمي جهت ارسال داده از يك صفحه به صفحه ديگر استفاده مي گردد . روش فوق در برنامه هائي با محوريت بانك هاي اطلاعاتي بيشتر مورد توجه است . در چنين مواردي در آغاز ليستي از آيتم هائي نمايش داده مي شود كه متاثر از داده موجود در بانك اطلاعاتي است ( نظير ليست محصولات ، ليست مقالات ، ليست خبرها و ... ) . پس از انتخاب يكي از آيتم ها ، كاربر به صفحه اي ديگر هدايت مي گردد تا اطلاعات بيشتري در ارتباط با آيتم انتخابي در اختيار وي گذاشته شود .
براي ذخيره اطلاعات در query string ، مي بايست پياده كنندگان خود اطلاعات را در مكان مورد نظر قرار دهند . متاسفانه ، روشي مبتني بر collection براي انجام اين كار وجود ندارد . اين بدان معني است كه در چنين مواردي مي بايست عموما" از يك كنترل Hyperlink خاص و يا عبارت Response.Redirect استفاده كرد .
كد زير كاربر را به صفحه newspage.aspx هدايت مي نمايد . همراه با كاربر متغيري با نام recordID و مقدار 10 نيز براي صفحه فوق ارسال مي گردد .
Response.Redirect("newpage.aspx?recordID=10") |
در صورت نياز مي توان چندين پارامتر را كه توسط علامت & ( ampersand ) از يكديگر جدا مي شوند ، به صفحه مقصد ارسال كرد .
كد زير كاربر را به صفحه newspage.aspx هدايت مي نمايد . همراه با كاربر متغيرهائي با نام recordID و مقدار 10 و mode با مقدار full نيز براي صفحه فوق ارسال مي گردد .
Response.Redirect("newpage.aspx?recordID=10&mode=full") |
صفحه دريافت كننده به سادگي مي تواند اطلاعات ارسالي را دريافت نمايد . بدين منظور از مجموعه ديكشنري QueryString كه توسط شي Request ارائه شده است ، استفاده مي گردد .
Dim ID As String = Request.QueryString("recordID") |
توجه داشته باشيد كه اطلاعات همواره به عنوان يك رشته بازيابي مي گردند و در صورت نياز مي بايست آنها را به نوع داده مورد نظر تبديل كرد . مقادير ذخيره شده در مجموعه QueryString ، با استفاده از اسامي متغيرها ، ايندكس مي گردند .
query string بر خلاف view state ، اطلاعات را كاملا" شفاف ، آشكارا و غير رمز شده ارسال مي نمايد . بنابراين در مواردي كه لازم است اطلاعاتي بطور مخفي از يك صفحه به صفحه ديگر ارسال و يا بر روي آن حساسيت خاصي از نظر امنيتي وجود دارد ، استفاده از روش query string توصيه نمي گردد .
مثال
در اين مثال هدف بررسي نحوه عملكرد و يا رفتار query string با استفاده از دو صفحه است . در صفحه مبداء ليستي از آيتم ها در اختيار كاربر گذاشته مي شود . پس از انتخاب يكي از آيتم ها ، كاربر به يك صفحه جديد ( مقصد ) هدايت مي گردد . در صفحه مقصد آيتم انتخاب شده به همراه مقدار متغير mode در خروجي نمايش داده مي شود .
صفحه مبداء شامل ليستي از آيتم ها ، يك check box ، يك كنترل label و دكمه "مشاهده اطلاعات " است .
كد زير محتويات صفحه مبداء ( QueryStringSender.aspx ) را نشان مي دهد .
صفحه QueryStringSender.aspx |
<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %>
<script runat="server"> Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load If Not Me.IsPostBack Then lstItems.Items.Add("مقالات ") lstItems.Items.Add("نكته ها") lstItems.Items.Add("خودآزمون ها") lstItems.Items.Add("خود آموزها") lstItems.Items.Add("هيچكدام") End If End Sub
Protected Sub cmdGo_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cmdGo.Click If lstItems.SelectedIndex = -1 Then lblError.Text = " يكي از آيتم هاي موجود در ليست را انتخاب نمائيد" Else Dim Url As String = "QueryStringRecipient.aspx?" Url &= "Item=" & lstItems.SelectedItem.Text & "&" Url &= "Mode=" & chkDetails.Checked.ToString() Response.Redirect(Url) End If End Sub </script>
<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl"> <head runat="server"> <title>تست query string | صفحه ارسال كننده</title> </head> <body> <form id="form1" runat="server"> <div> <span style="font-size: 9pt; font-family: Tahoma"> <strong> <span style="color: #006699"> علاقه مند به مشاهده كدام بخش از سايت سخا روش مي باشيد ؟ </span><br /> </strong> </span><br /> <asp:ListBox ID="lstItems" runat="server" Height="90px" Width="165px" Font-Names="Tahoma"></asp:ListBox><br /> <br /> <asp:CheckBox ID="chkDetails" runat="server" Text="جزئيات نمايش داده شود ؟" TextAlign="Right" Font-Names="Tahoma" /><br /> <br /> <asp:Button ID="cmdGo" runat="server" Text="مشاهده اطلاعات" Width="122px" Font-Names="Tahoma" /><br /><br /> <asp:Label ID="lblError" runat="server" EnableViewState="False" Font-Names="Tahoma" ForeColor="Red"></asp:Label> </div> </form> </body> </html> |
كد زير محتويات صفحه مقصد ( QueryStringRecipient.aspx ) را نشان مي دهد .
صفحه QueryStringRecipient.aspx |
<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %>
<script runat="server"> Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load lblInfo.Text = "آيتم انتخاب شده توسط كاربر : " & "<b>" & Request.QueryString("Item") & "</b>" lblInfo.Text &= "<br>نمايش تمامي اطلاعات : " & "<b>" lblInfo.Text &= Request.QueryString("Mode") & "</b>" End Sub </script>
<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl"> <head runat="server"> <title>تست query string | صفحه دريافت كننده</title> </head> <body style="font-family: Tahoma;"> <form id="form1" runat="server"> <div > <asp:Label ID="lblInfo" runat="server" EnableViewState="False" Font-Names="Tahoma" > </asp:Label> </div> </form> </body> </html> |
شكل 1 ، نحوه عملكرد Query string را در ارتباط با صفحه مبداء (QueryStringSender.aspx) و مقصد (QueryStringRecipient.aspx ) نشان مي دهد .
شكل 1 : نحوه عملكرد Query string
URL Encoding
يكي از مسائل در ارتباط با روش query string ، استفاده از كاراكترهاي غيرمجاز در يك URL است . ليست كاراكترهاي مجاز در يك URL بمراتب كمتر از ليست كاراكترهاي مجاز در يك سند HTML است . تمامي كاراكترها مي بايست الفبا عددي و يا يكي از مجموعه كاراكترهاي خاص نظير $-_.+!*'() باشد . علاوه بر كاراكترهاي فوق ، برخي مرورگرها ممكن است داراي محدوديت هاي مختص به خود نيز باشند .
در صورتي كه لازم است مجاز بودن كاراكترهاي ذخيره شده در query string بررسي گردد ، مي توان از URL encoding استفاده كرد . با استفاده از ويژگي فوق ، كاراكترهاي خاص با دنباله اي از escaped character جايگزين مي گردند كه با علامت درصد (%) شروع و به دنبال آن يك عدد دو رقمي مبناي شانزده آورده مي شود ( مثلا" space به 20 % تبديل مي گردد ) .
از متدهاي كلاس HttpServerUtility مي توان براي encode اتوماتيك داده استفاده كرد .
كد زير نحوه encoding يك رشته حاوي داده جهت استفاده در query string را نشان مي دهد . بدين ترتيب ، تمامي كاراكترهاي غيرمجاز با دنباله اي از escaped character جايگزين مي گردند .
Dim productName As String = "Test Product" Response.Redirect("newpage.aspx?productName=" & Server.UrlEncode(productName)) |
از كد زير براي decoding در صفحه مقصد استفاده مي گردد .
Dim ID As String = Server.UrlDecode(Request.QueryString("recordID")) |
متاسفانه ، ASP.NET داراي مكانيزم خاصي جهت بررسي و رمزنگاري اتوماتيك query string نمي باشد . با استفاده از كلاس هاي متعدد رمزنگاري ارائه شده در دات نت ، مي توان رشته هاي query string را رمز و يك سطح مطلوب امنيتي در ارتباط با آنها را ايجاد كرد ( اميدواريم در آينده و در مقالاتي جداگانه اين موضوع را بطور كامل تشريح نمائيم ) .
در بخش هفتم به بررسي كوكي هاي سفارشي جهت ذخيره و بازيابي اطلاعات خواهيم پرداخت .
برگرفته از سايت سخا روش