<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Maciej Grabek &#187; HttpCookie.Expires</title>
	<atom:link href="https://blog.maciejgrabek.com/tag/httpcookie-expires/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.maciejgrabek.com</link>
	<description>/* Make it See Sharp - Windows Phone, C#, .NET i nie tylko */</description>
	<lastBuildDate>Mon, 27 Oct 2014 11:18:40 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>Problem z HttpCookie.Expires i jQuery</title>
		<link>https://blog.maciejgrabek.com/2010/08/24/problem-z-httpcookie-expires-i-jquery/</link>
		<comments>https://blog.maciejgrabek.com/2010/08/24/problem-z-httpcookie-expires-i-jquery/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 22:53:00 +0000</pubDate>
		<dc:creator><![CDATA[maciek]]></dc:creator>
				<category><![CDATA[Ciekawostki]]></category>
		<category><![CDATA[HOW TO]]></category>
		<category><![CDATA[HttpCookie.Expires]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://maciejgrabek.com/maciek_blog/?p=9995</guid>
		<description><![CDATA[Dziś na temat korzystania z jQuery i ciasteczek. Jako scenariusz przyjmijmy proste zliczenie kliknięć, gdzie licznik przechowujemy jako wartość ciastka. W tym celu tworzymy aplikację ASP.NET MVC wraz z testowym kontrolerem i dwoma widokami – Indeks, który jest widokiem bazowym i Modify, który zwraca kawałek html’a z zawartością ciastka. Kotroler inicjujemy w następujący sposób:   1 using System;   2 using System.Collections.Generic;   3 using System.Linq;   4 using System.Web;   5 using System.Web.Mvc;   6   7 namespace CookieAndJQuery.Controllers   8 {   9     [HandleError] 10     public class TestsController : Controller 11     { 12         private static string CookieName = &#8220;TestCookie&#8221;; 13 14         public ActionResult Index() 15         { 16             return View(); 17         } 18 19         public ActionResult Modify() 20         { 21             HttpCookie cookie = Request.Cookies[CookieName]; 22             if (cookie == null) 23             { 24                 cookie = new HttpCookie(CookieName, &#8220;0&#8221;); 25                 cookie.Expires = DateTime.MaxValue; 26             } 27 28             int v = int.Parse(cookie.Value); 29             cookie.Value = (++v).ToString(); 30             Response.Cookies.Add(cookie); 31             ViewData[&#8220;itemValue&#8221;]= cookie.Value; 32             return View(); 33         } 34     } 35 } Indeks ma za zadanie po kliknięciu przycisku wywołać akcję Modify w kontrolerze TestsController a następnie wstrzyknąć jej wynik do diva o id=”resultContainer”   1 &#60;%@ Page Language=&#8220;C#&#8221; Inherits=&#8220;System.Web.Mvc.ViewPage&#8221; %&#62;   2 &#60;html&#62;   3 &#60;head<a href="https://blog.maciejgrabek.com/2010/08/24/problem-z-httpcookie-expires-i-jquery/" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
				<content:encoded><![CDATA[<p>Dziś na temat korzystania z jQuery i ciasteczek. Jako scenariusz przyjmijmy proste zliczenie kliknięć, gdzie licznik przechowujemy jako wartość ciastka.</p>
<p>W tym celu tworzymy aplikację ASP.NET MVC wraz z testowym kontrolerem i dwoma widokami – Indeks, który jest widokiem bazowym i Modify, który zwraca kawałek html’a z zawartością ciastka.</p>
<p><a rel="WLPP" href="https://mgh8dg.blu.livefilestore.com/y1mt7PtH1tRrIqF3XHreBbDtm7IhGxp-8SJRMB8zODTWsmpZyXyyxbQ2gDqBR1bfFtcQxqCtuoy1TkYE-w2cg_GAr31j-Yda9WoB7vrmqYmf_p66d8Umx5pEQZ80tukS42QvHI70r7L_Z3SkvgFoFaDLg/image[3] 21C939A5.png?download&amp;psid=1"></a></p>
<p><a href="http://maciejgrabek.com/wp-content/uploads/2010/08/jqproblemSolutionExplorer.png"><img class="alignnone size-full wp-image-10111" title="jqproblemSolutionExplorer" src="http://maciejgrabek.com/wp-content/uploads/2010/08/jqproblemSolutionExplorer.png" alt="" width="237" height="308" /></a></p>
<p>Kotroler inicjujemy w następujący sposób:</p>
<div style="font-family: courier new;"><span style="color: teal;">  1</span> <span style="color: blue;">using</span> System;<br />
<span style="color: teal;">  2</span> <span style="color: blue;">using</span> System.Collections.Generic;<br />
<span style="color: teal;">  3</span> <span style="color: blue;">using</span> System.Linq;<br />
<span style="color: teal;">  4</span> <span style="color: blue;">using</span> System.Web;<br />
<span style="color: teal;">  5</span> <span style="color: blue;">using</span> System.Web.Mvc;<br />
<span style="color: teal;">  6</span><br />
<span style="color: teal;">  7</span> <span style="color: blue;">namespace</span> CookieAndJQuery.Controllers<br />
<span style="color: teal;">  8</span> {<br />
<span style="color: teal;">  9</span>     [HandleError]<br />
<span style="color: teal;">10</span>     <span style="color: blue;">public</span> <span style="color: blue;">class</span> TestsController : Controller<br />
<span style="color: teal;">11</span>     {<br />
<span style="color: teal;">12</span>         <span style="color: blue;">private</span> <span style="color: blue;">static</span> <span style="color: blue;">string</span> CookieName = <span style="color: maroon;">&#8220;TestCookie&#8221;</span>;<br />
<span style="color: teal;">13</span><br />
<span style="color: teal;">14</span>         <span style="color: blue;">public</span> ActionResult Index()<br />
<span style="color: teal;">15</span>         {<br />
<span style="color: teal;">16</span>             <span style="color: blue;">return</span> View();<br />
<span style="color: teal;">17</span>         }<br />
<span style="color: teal;">18</span><br />
<span style="color: teal;">19</span>         <span style="color: blue;">public</span> ActionResult Modify()<br />
<span style="color: teal;">20</span>         {<br />
<span style="color: teal;">21</span>             HttpCookie cookie = Request.Cookies[CookieName];<br />
<span style="color: teal;">22</span>             <span style="color: blue;">if</span> (cookie == <span style="color: blue;">null</span>)<br />
<span style="color: teal;">23</span>             {<br />
<span style="color: teal;">24</span>                 cookie = <span style="color: blue;">new</span> HttpCookie(CookieName, <span style="color: maroon;">&#8220;0&#8221;</span>);<br />
<span style="color: teal;">25</span>                 cookie.Expires = DateTime.MaxValue;<br />
<span style="color: teal;">26</span>             }<br />
<span style="color: teal;">27</span><br />
<span style="color: teal;">28</span>             <span style="color: blue;">int</span> v = <span style="color: blue;">int</span>.Parse(cookie.Value);<br />
<span style="color: teal;">29</span>             cookie.Value = (++v).ToString();<br />
<span style="color: teal;">30</span>             Response.Cookies.Add(cookie);<br />
<span style="color: teal;">31</span>             ViewData[<span style="color: maroon;">&#8220;itemValue&#8221;</span>]= cookie.Value;<br />
<span style="color: teal;">32</span>             <span style="color: blue;">return</span> View();<br />
<span style="color: teal;">33</span>         }<br />
<span style="color: teal;">34</span>     }<br />
<span style="color: teal;">35</span> }</div>
<p>Indeks ma za zadanie po kliknięciu przycisku wywołać akcję <span style="font-family: Consolas;">Modify</span> w kontrolerze <span style="font-family: Consolas;">TestsController</span> a następnie wstrzyknąć jej wynik do diva o <span style="font-family: Consolas;">id=”resultContainer”</span></p>
<div style="font-family: courier new;"><span style="color: teal;">  1</span> &lt;%@ Page Language=<span style="color: maroon;">&#8220;C#&#8221;</span> Inherits=<span style="color: maroon;">&#8220;System.Web.Mvc.ViewPage&#8221;</span> %&gt;<br />
<span style="color: teal;">  2</span> &lt;html&gt;<br />
<span style="color: teal;">  3</span> &lt;head runat=<span style="color: maroon;">&#8220;server&#8221;</span>&gt;<br />
<span style="color: teal;">  4</span>     &lt;title&gt;Index&lt;/title&gt;<br />
<span style="color: teal;">  5</span>     &lt;script src=<span style="color: maroon;">&#8220;Scripts/jquery-1.4.1.min.js&#8221;</span> type=<span style="color: maroon;">&#8220;text/javascript&#8221;</span>&gt;&lt;/script&gt;<br />
<span style="color: teal;">  6</span> &lt;/head&gt;<br />
<span style="color: teal;">  7</span> &lt;body&gt;<br />
<span style="color: teal;">  8</span>     &lt;div&gt;<br />
<span style="color: teal;">  9</span>         &lt;input type=<span style="color: maroon;">&#8220;button&#8221;</span> id=<span style="color: maroon;">&#8220;btnTestCookies&#8221;</span> value=<span style="color: maroon;">&#8220;ClickMe&#8221;</span> /&gt;<br />
<span style="color: teal;">10</span>         &lt;div id=<span style="color: maroon;">&#8220;resultContainer&#8221;</span>&gt;&lt;/div&gt;<br />
<span style="color: teal;">11</span>     &lt;/div&gt;<br />
<span style="color: teal;">12</span>     &lt;script type=<span style="color: maroon;">&#8220;text/javascript&#8221;</span>&gt;<br />
<span style="color: teal;">13</span>         $(<span style="color: maroon;">&#8220;#btnTestCookies&#8221;</span>).click(function () {<br />
<span style="color: teal;">14</span>             $.ajax(<br />
<span style="color: teal;">15</span>                 {<br />
<span style="color: teal;">16</span>                     url: <span style="color: maroon;">&#8220;/Tests/Modify&#8221;</span>,<br />
<span style="color: teal;">17</span>                     success: function (data) {<br />
<span style="color: teal;">18</span>                         $(<span style="color: maroon;">&#8220;#resultContainer&#8221;</span>).html(data);<br />
<span style="color: teal;">19</span>                     },<br />
<span style="color: teal;">20</span>                     cache: <span style="color: maroon;">false</span>,<br />
<span style="color: teal;">21</span>                     dataType: <span style="color: maroon;">&#8220;html&#8221;</span><br />
<span style="color: teal;">22</span>                 }<br />
<span style="color: teal;">23</span>             );<br />
<span style="color: teal;">24</span>         });<br />
<span style="color: teal;">25</span>     &lt;/script&gt;<br />
<span style="color: teal;">26</span> &lt;/body&gt;<br />
<span style="color: teal;">27</span> &lt;/html&gt;</div>
<p><span style="font-family: Consolas;"> </span></p>
<p>Dla pełnego obrazu poniżej widnieje zawartość widoku Modify:</p>
<div style="font-family: courier new;"><span style="color: teal;">  1</span> &lt;%@ Page Language=<span style="color: maroon;">&#8220;C#&#8221;</span> Inherits=<span style="color: maroon;">&#8220;System.Web.Mvc.ViewPage&#8221;</span> Buffer=<span style="col: maroon;">&#8220;false&#8221;</span> %&gt;<br />
<span style="color: teal;">  2</span> &lt;div&gt;<br />
<span style="color: teal;">  3</span>     &lt;%= ViewData[<span style="color: maroon;">&#8220;itemValue&#8221;</span>] %&gt;<br />
<span style="color: teal;">  4</span> &lt;/div&gt;</div>
<p>Skoro mamy już bazę do doświadczeń pora przejść do sedna problemu, a mianowiscie do obsługi ciastek. Jak zapewne zauważyliście kontroler w linii 25 ustawia czas wygaśnięcia ciastka na DateTime.MaxValue, czyli ciastko nigdy nie wygaśnie. Na pierwszy rzut oka nie widać problemu: wywołujemy akcję, akcja zmienia wartość ciastka, ciastko wraca do przeglądarki, klikamy ponownie, wartość wzrasta – super! Jednakże spójżmy jak faktycznie wygląda ciastko, które otrzymujemy:</p>
<p>Pierwsze wywołanie strony – tworzymy ciastko</p>
<p><a rel="WLPP" href="https://mgh8dg.blu.livefilestore.com/y1mxqZVfy6tZdybrcIoW1enKLaHzU2h4LElj6ONG0_mYFUCKYRK-JtsrMA9P43hTAPvWIxgdd3enNBStRxoj05qe7LR8cvNsugsPhQKpAktcrLVgHGp2-i4WfpXsr8zhC2yNPyLGjTZ45pK4RwQf5wmeQ/image[7] 2C719587.png?download&amp;psid=1"></a></p>
<p><a href="http://maciejgrabek.com/wp-content/uploads/2010/08/expires1.png"><img class="alignnone size-full wp-image-10112" title="expires1" src="http://maciejgrabek.com/wp-content/uploads/2010/08/expires1.png" alt="" width="399" height="212" /></a></p>
<p>Kolejne wywołanie strony – niestety jak widać poniżej czas wygaśnięcia ciastka przypadnie na koniec sesji:</p>
<p><a rel="WLPP" href="https://mgh8dg.blu.livefilestore.com/y1mBfNEA0H53HMziANCWppUBUCAPgRaHygB989ANARPE7qHXy01UQlFfqlx1MjHXfrOdOD7Wm0Wq9wV_MVEc6_Cp83oV5Ie2JD3rNUkUKYNIQ49or7ie2KqbqBMa5Ke2pGJKMRhTabsnk2rG6owsOiq1g/image[11] 587A58AC.png?download&amp;psid=1"></a></p>
<p><a href="http://maciejgrabek.com/wp-content/uploads/2010/08/expires2.png"><img class="alignnone size-full wp-image-10113" title="expires2" src="http://maciejgrabek.com/wp-content/uploads/2010/08/expires2.png" alt="" width="485" height="198" /></a></p>
<p>Przez to po zamknięciu i ponownym uruchomieniu przeglądarki ciastko zostanie usuniete a tym samym licznik zostanie zresetowany&#8230;</p>
<p>Przyjrzyjmy się jak wygląda request i response. Korzystając z <a href="http://www.fiddler2.com/fiddler2">Fiddlera</a> można podejrzeć treść nagłówka Cookies, w którym widać wszystko jak na dłoni:</p>
<p>Odpowiedź po pierwszym wywołaniu (ustawiamy ciastko)</p>
<p><a rel="WLPP" href="https://mgh8dg.blu.livefilestore.com/y1mFXhXddv2qmKmF2f_YIEhoMD9hxiRVqGTaWKkF6Ezr_oKj7ahdoHWexhSZv5We3-d3VzopFneeeqNSkdPWb6dlswKIS_ZPW57ENR6s3sWOK7z78bLTohzG0QQY4VC6-gQKVtMhJIBdAY9Mnc06ptfJA/image[16].png?download&amp;psid=1"></a></p>
<p><a href="http://maciejgrabek.com/wp-content/uploads/2010/08/cookiePreview.png"><img class="alignnone size-full wp-image-10114" title="cookiePreview" src="http://maciejgrabek.com/wp-content/uploads/2010/08/cookiePreview.png" alt="" width="433" height="34" /></a></p>
<p>Request przy kojelnych kliknięciach przycisku – jak widać brak przy żądaniu informacji o ekspiracji ciastka, co skuktuje opisanym zachowaniem.</p>
<p><a href="http://maciejgrabek.com/wp-content/uploads/2010/08/requestHeaders.png"><img class="alignnone size-full wp-image-10115" title="requestHeaders" src="http://maciejgrabek.com/wp-content/uploads/2010/08/requestHeaders.png" alt="" width="442" height="156" /></a></p>
<p>Jak to ominąć? W przypadku, który miałem jako zadanie postanowiłem przy każdym takim wywołaniu ustawiać czas życia ciastka na DateTime.MaxValue, dzięki  czemu po ponownym uruchomieniu przeglądarki ciastko nadal tam jest&#8230;</p>
<div style="font-family: courier new;"><span style="color: teal;">  1</span> <span style="color: blue;">public</span> ActionResult Modify()<br />
<span style="color: teal;">  2</span> {<br />
<span style="color: teal;">  3</span>     HttpCookie cookie = Request.Cookies[CookieName];<br />
<span style="color: teal;">  4</span>     <span style="color: blue;">if</span> (cookie == <span style="color: blue;">null</span>)<br />
<span style="color: teal;">  5</span>     {<br />
<span style="color: teal;">  6</span>         cookie = <span style="color: blue;">new</span> HttpCookie(CookieName, <span style="color: maroon;">&#8220;0&#8221;</span>);<br />
<span style="color: teal;">  7</span>         cookie.Expires = DateTime.MaxValue;<br />
<span style="color: teal;">  8</span>     }<br />
<span style="color: teal;">  9</span><br />
<span style="color: teal;">10</span>     cookie.Expires = DateTime.MaxValue;<br />
<span style="color: teal;">11</span>     <span style="color: blue;">int</span> v = <span style="color: blue;">int</span>.Parse(cookie.Value);<br />
<span style="color: teal;">12</span>     cookie.Value = (++v).ToString();<br />
<span style="color: teal;">13</span>     Response.Cookies.Add(cookie);<br />
<span style="color: teal;">14</span>     ViewData[<span style="color: maroon;">&#8220;itemValue&#8221;</span>] = cookie.Value;<br />
<span style="color: teal;">15</span>     <span style="color: blue;">return</span> View();<br />
<span style="color: teal;">16</span> }</div>
<p>W wyniku tej modyfikacji informacja o ciastkach znajdująca się w odpowiedzi wygląda następująco</p>
<p><a rel="WLPP" href="https://mgh8dg.blu.livefilestore.com/y1m81SfofM5Qn0WRCUFDqJMeoyLxB-Cfvc5FHUDOj_hi4Dh06Jx5WtHohPjHLRg-NHbS2Bv7ebhFAYUMlSYMtgqwBGNJP26lqpKLYU4N_uafhWn31r_WpzSPXYP7hawWsQLdm9DUG07QZJvsvzdid4a-Q/image[36].png?download&amp;psid=1"></a></p>
<p><a href="http://maciejgrabek.com/wp-content/uploads/2010/08/requestHeaders2.png"><img class="alignnone size-full wp-image-10116" title="requestHeaders2" src="http://maciejgrabek.com/wp-content/uploads/2010/08/requestHeaders2.png" alt="" width="442" height="138" /></a></p>
<p>dzięki czemu przy kolejnym uruchomieniu przeglądarki ciastko nadal tam będzie gotowe do użycia <img src="https://blog.maciejgrabek.com/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
			<wfw:commentRss>https://blog.maciejgrabek.com/2010/08/24/problem-z-httpcookie-expires-i-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
