PageSourceSearch

https://ansonznl.github.io/assets/js/v-3d499c1a.2a265e8d.js

js ansonznl.github.io collected 2026-10-03 08:39:33 UTC 22,961 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[4497],{6424:(n,s,a)=>{a.r(s),a.d(s,{data:()=>e});const e={key:"v-3d499c1a",path:"/articles/Node/koa%E7%B3%BB%E5%88%97%EF%BC%884%EF%BC%89-koa%E5%AE%9E%E7%8E%B0cookie%E5%92%8Csession.html",title:"koa2使用cookie",lang:"en-US",frontmatter:{},excerpt:"",headers:[{level:2,title:"使用方法",slug:"使用方法",children:[]},{level:2,title:"例子代码",slug:"例子代码",children:[]},{level:2,title:"运行例子",slug:"运行例子",children:[{level:3,title:"执行脚本",slug:"执行脚本",children:[]},{level:3,title:"运行结果",slug:"运行结果",children:[]}]},{level:2,title:"前言",slug:"前言",children:[]},{level:2,title:"数据库存储方案",slug:"数据库存储方案",children:[]},{level:2,title:"快速使用",slug:"快速使用",children:[{level:3,title:"例子代码",slug:"例子代码-1",children:[]},{level:3,title:"运行例子",slug:"运行例子-1",children:[]}]}],filePathRelative:"articles/Node/koa系列(4)-koa实现cookie和session.md",git:{}}},1470:(n,s,a)=>{a.r(s),a.d(s,{default:()=>C});var e=a(6252);const p=(0,e._)("h1",{id:"koa2使用cookie",tabindex:"-1"},[(0,e._)("a",{class:"header-anchor",href:"#koa2使用cookie","aria-hidden":"true"},"#"),(0,e.Uk)(" koa2使用cookie")],-1),t=(0,e._)("h2",{id:"使用方法",tabindex:"-1"},[(0,e._)("a",{class:"header-anchor",href:"#使用方法","aria-hidden":"true"},"#"),(0,e.Uk)(" 使用方法")],-1),o=(0,e._)("p",null,"koa提供了从上下文直接读取、写入cookie的方法",-1),l=(0,e._)("ul",null,[(0,e._)("li",null,"ctx.cookies.get(name, [options]) 读取上下文请求中的cookie"),(0,e._)("li",null,"ctx.cookies.set(name, value, [options]) 在上下文中写入cookie")],-1),c=(0,e.Uk)("koa2 中操作的cookies是使用了npm的cookies模块,源码在"),i={href:"https://github.com/pillarjs/cookies",target:"_blank",rel:"noopener noreferrer"},r=(0,e.Uk)("https://github.com/pillarjs/cookies"),u=(0,e.Uk)(",所以在读写cookie的使用参数与该模块的使用一致。"),k=(0,e.uE)('<h2 id="例子代码" tabindex="-1"><a class="header-anchor" href="#例子代码" aria-hidden="true">#</a> 例子代码</h2><div class="language-javascript ext-js line-numbers-mode"><pre class="language-javascript"><code><span class="token keyword">const</span> Koa <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">&#39;koa&#39;</span><span class="token punctuation">)</span>\n<span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Koa</span><span class="token punctuation">(</span><span class="token punctuation">)</span>\n\napp<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token parameter">ctx</span> <span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>\n\n  <span class="token keyword">if</span> <span class="token punctuation">(</span> ctx<span class="token punctuation">.</span>url <span class="token operator">===</span> <span class="token string">&#39;/index&#39;</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>\n    ctx<span class="token punctuation">.</span>cookies<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>\n      <span class="token string">&#39;cid&#39;</span><span class="token punctuation">,</span> \n      <span class="token string">&#39;hello world&#39;</span><span class="token punctuation">,</span>\n      <span class="token punctuation">{</span>\n        domain<span class="token operator">:</span> <span class="token string">&#39;localhost&#39;</span><span class="token punctuation">,</span>  <span class="token comment">// 写cookie所在的域名</span>\n        path<span class="token operator">:</span> <span class="token string">&#39;/index&#39;</span><span class="token punctuation">,</span>
1       <span class="token comment">// 写cookie所在的路径</span>\n        maxAge<span class="token operator">:</span> <span class="token number">10</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">*</span> <span class="token number">1000</span><span class="token punctuation">,</span> <span class="token comment">// cookie有效时长</span>\n        expires<span class="token operator">:</span> <span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token string">&#39;2017-02-15&#39;</span><span class="token punctuation">)</span><span class="token punctuation">,</span>  <span class="token comment">// cookie失效时间</span>\n        httpOnly<span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>  <span class="token comment">// 是否只用于http请求中获取</span>\n        overwrite<span class="token operator">:</span> <span class="token boolean">false</span>  <span class="token comment">// 是否允许重写</span>\n      <span class="token punctuation">}</span>\n    <span class="token punctuation">)</span>\n    ctx<span class="token punctuation">.</span>body <span class="token operator">=</span> <span class="token string">&#39;cookie is ok&#39;</span>\n  <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>\n    ctx<span class="token punctuation">.</span>body <span class="token operator">=</span> <span class="token string">&#39;hello world&#39;</span> \n  <span class="token punctuation">}</span>\n\n<span class="token punctuation">}</span><span class="token punctuation">)</span>\n\napp<span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span><span class="token number">3000</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>\n  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">&#39;[demo] cookie is starting at port 3000&#39;</span><span class="token punctuation">)</span>\n<span class="token punctuation">}</span><span class="token punctuation">)</span>\n\n\n</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br></div></div><h2 id="运行例子" tabindex="-1"><a class="header-anchor" href="#运行例子" aria-hidden="true">#</a> 运行例子</h2><h3 id="执行脚本" tabindex="-1"><a class="header-anchor" href="#执行脚本" aria-hidden="true">#</a> 执行脚本</h3><div class="language-bash ext-sh line-numbers-mode"><pre class="language-bash"><code>node index.js\n</code></pre><div class="line-numbers"><span class="line-number">1</span><br></div></div><h3 id="运行结果" tabindex="-1"><a class="header-anchor" href="#运行结果" aria-hidden="true">
1#</a> 运行结果</h3>',6),b={id:"访问http-localhost-3000-index",tabindex:"-1"},d=(0,e._)("a",{class:"header-anchor",href:"#访问http-localhost-3000-index","aria-hidden":"true"},"#",-1),m=(0,e.Uk)(" 访问"),h={href:"http://localhost:3000/index",target:"_blank",rel:"noopener noreferrer"},g=(0,e.Uk)("http://localhost:3000/index"),f=(0,e.uE)('<ul><li>可以在控制台的cookie列表中中看到写在页面上的cookie</li><li>在控制台的console中使用document.cookie可以打印出在页面的所有cookie(需要是httpOnly设置false才能显示)</li></ul><p><img src="https://s2.loli.net/2022/06/18/jDM7ki51dLeF4Hc.png" alt="cookie-result-01.png"></p><h1 id="koa2实现session" tabindex="-1"><a class="header-anchor" href="#koa2实现session" aria-hidden="true">#</a> koa2实现session</h1><h2 id="前言" tabindex="-1"><a class="header-anchor" href="#前言" aria-hidden="true">#</a> 前言</h2><p>koa2原生功能只提供了cookie的操作,但是没有提供session操作。session就只用自己实现或者通过第三方中间件实现。在koa2中实现session的方案有一下几种</p><ul><li>如果session数据量很小,可以直接存在内存中</li><li>如果session数据量很大,则需要存储介质存放session数据</li></ul><h2 id="数据库存储方案" tabindex="-1"><a class="header-anchor" href="#数据库存储方案" aria-hidden="true">#</a> 数据库存储方案</h2><ul><li>将session存放在MySQL数据库中</li><li>需要用到中间件 <ul><li>koa-session-minimal 适用于koa2 的session中间件,提供存储介质的读写接口 。</li><li>koa-mysql-session 为koa-session-minimal中间件提供MySQL数据库的session数据读写操作。</li><li>将sessionId和对应的数据存到数据库</li></ul></li><li>将数据库的存储的sessionId存到页面的cookie中</li><li>根据cookie的sessionId去获取对于的session信息</li></ul><h2 id="快速使用" tabindex="-1"><a class="header-anchor" href="#快速使用" aria-hidden="true">#</a> 快速使用</h2><p>demo源码</p>',10),x={href:"https://github.com/ChenShenhai/koa2-note/blob/master/demo/session/index.js",target:"_blank",rel:"noopener noreferrer"},y=(0,e.Uk)("https://github.com/ChenShenhai/koa2-note/blob/master/demo/session/index.js"),v=(0,e.uE)('<h3 id="例子代码-1" tabindex="-1"><a class="header-anchor" href="#例子代码-1" aria-hidden="true">#</a> 例子代码</h3><div class="language-javascript ext-js line-numbers-mode"><pre class="language-javascript"><code><span class="token keyword">const</span> Koa <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">&#39;koa&#39;</span><span class="token punctuation">)</span>\n<span class="token keyword">const</span> session <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">&#39;koa-session-minimal&#39;</span><span class="token punctuation">)</span>\n<span class="token keyword">const</span> MysqlSession <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">&#39;koa-mysql-session&#39;</span><span class="token punctuation">)</span>\n\n<span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Koa</span><span class="token punctuation">(</span><span class="token punctuation">)</span>\n\n<span class="token comment">// 配置存储session信息的mysql</span>\n<span class="token keyword">let</span> store <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MysqlSession</span><span class="token punctuation">(</span><span class="token punctuation">{</span>\n  user<span class="token operator">:</span> <span class="token string">&#39;root&#39;</span><span class="token punctuation">,</span>\n  password<span class="token operator">:</span> <span class="token string">&#39;abc123&#39;</span><span class="token punctuation">,</span>\n  database<span class="token operator">:</span> <span class="token string">&#39;koa_demo&#39;</span><span class="token punctuation">,</span>\n  host<span class="token operator">:</span> <span class="token string">&#39;127.0.0.1&#39;</span><span class="token punctuation">,</span>\n<span class="token punctuation">}</span><span class="token punctuation">)</span>\n\n<span class="token comment">// 存放sessionId的cookie配置</span>\n<span class="token keyword">let</span> cookie <span class="token operator">=</span> <span class="token punctuation">{</span>\n  maxAge<span class="token operator">:</span> <span class="token string">&#39;&#39;</span><span class="token punctuation">,</span> <span class="token comment">// cookie有效时长</span>\n  expires<span class="token operator">:</span> <span class="token string">&#39;&#39;</span><span class="token punctuation">,</span>  <span class="token comment">// cookie失效时间</span>\n  path<span class="token operator">:</span> <span class="token string">&#39;&#39;</span><span class="token punctuation">,</span> <span class="token comment">// 写cookie所在的路径</span>\n  domain<span class="token operator">:</span> <span class="token string">&#39;&#39;</span><span class="token punctuation">,</span> <span class="token comment">// 写cookie所在的域名</span>\n  httpOnly<span class="token operator">:</span> <span class="token string">&#39;&#39;</span><span class="token punctuation">,</span> <span class="token comment">// 是否只用于http请求中获取</span>\n  overwrite<span class="token operator">:</span> <span class="token string">&#39;&#39;</span><span class="token punctuation">,</span>  <span class="token comment">// 是否允许重写</span>\n  secure<span class="token operator">:</span> <span class="token string">&#39;&#39;</span><span class="token punctuation">,</span>\n  sameSite<span class="token operator">:</span> <span class="token string">&#39;&#39;</span><span class="token punctuation">,</span>\n  signed<span class="token operator">:</span> <span class="token string">&#39;&#39;</span><span class="token punctuation">,</span>\n  \n<span class="token punctuation">}</span>\n\n<span class="token comment">// 使用session中间件</span>\napp<span class="token punctuation">.</span><span class="token function">
1use</span><span class="token punctuation">(</span><span class="token function">session</span><span class="token punctuation">(</span><span class="token punctuation">{</span>\n  key<span class="token operator">:</span> <span class="token string">&#39;SESSION_ID&#39;</span><span class="token punctuation">,</span>\n  store<span class="token operator">:</span> store<span class="token punctuation">,</span>\n  cookie<span class="token operator">:</span> cookie\n<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span>\n\napp<span class="token punctuation">.</span><span class="token function">use</span><span class="token punctuation">(</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token parameter">ctx</span> <span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span>\n\n  <span class="token comment">// 设置session</span>\n  <span class="token keyword">if</span> <span class="token punctuation">(</span> ctx<span class="token punctuation">.</span>url <span class="token operator">===</span> <span class="token string">&#39;/set&#39;</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>\n    ctx<span class="token punctuation">.</span>session <span class="token operator">=</span> <span class="token punctuation">{</span>\n      user_id<span class="token operator">:</span> Math<span class="token punctuation">.</span><span class="token function">random</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token number">36</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">substr</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span>\n      count<span class="token operator">:</span> <span class="token number">0</span>\n    <span class="token punctuation">}</span>\n    ctx<span class="token punctuation">.</span>body <span class="token operator">=</span> ctx<span class="token punctuation">.</span>session\n  <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> ctx<span class="token punctuation">.</span>url <span class="token operator">===</span> <span class="token string">&#39;/&#39;</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>\n\n    <span class="token comment">// 读取session信息</span>\n    ctx<span class="token punctuation">.</span>session<span class="token punctuation">.</span>count <span class="token operator">=</span> ctx<span class="token punctuation">.</span>session<span class="token punctuation">.</span>count <span class="token operator">+</span> <span class="token number">1</span>\n    ctx<span class="token punctuation">.</span>body <span class="token operator">=</span> ctx<span class="token punctuation">.</span>session\n  <span class="token punctuation">}</span> \n  \n<span class="token punctuation">}</span><span class="token punctuation">)</span>\n\napp<span class="token punctuation">.</span><span class="token function">listen</span><span class="token punctuation">(</span><span class="token number">3000</span><span class="token punctuation">)</span>\nconsole<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span><span class="token string">&#39;[demo] session is starting at port 3000&#39;</span><span class="token punctuation">)</span>\n</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">
153</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br></div></div><h3 id="运行例子-1" tabindex="-1"><a class="header-anchor" href="#运行例子-1" aria-hidden="true">#</a> 运行例子</h3><h4 id="执行命令" tabindex="-1"><a class="header-anchor" href="#执行命令" aria-hidden="true">#</a> 执行命令</h4><div class="language-bash ext-sh line-numbers-mode"><pre class="language-bash"><code>node index.js\n</code></pre><div class="line-numbers"><span class="line-number">1</span><br></div></div><h4 id="访问连接设置session" tabindex="-1"><a class="header-anchor" href="#访问连接设置session" aria-hidden="true">#</a> 访问连接设置session</h4>',6),w={href:"http://localhost:3000/set",target:"_blank",rel:"noopener noreferrer"},_=(0,e.Uk)("http://localhost:3000/set"),E=(0,e._)("img",{src:"https://s2.loli.net/2022/06/18/HCWcUeikJONY387.png",alt:"session-result-01.png"},null,-1),j=(0,e.uE)('<h4 id="查看数据库session是否存储" tabindex="-1"><a class="header-anchor" href="#查看数据库session是否存储" aria-hidden="true">#</a> 查看数据库session是否存储</h4><p><img src="https://s2.loli.net/2022/06/18/lysX8VKS36L19WF.png" alt="session-result-03.png"></p><h4 id="查看cookie中是否种下了sessionid" tabindex="-1"><a class="header-anchor" href="#查看cookie中是否种下了sessionid" aria-hidden="true">#</a> 查看cookie中是否种下了sessionId</h4>',3),S={href:"http://localhost:3000",target:"_blank",rel:"noopener noreferrer"},U=(0,e.Uk)("http://localhost:3000"),q=(0,e._)("img",{src:"https://s2.loli.net/2022/06/18/fWGwdV1j3pJmqUT.png",alt:"session-result-02.png"},null,-1),C={render:function(n,s){const a=(0,e.up)("OutboundLink");return(0,e.wg)(),(0,e.iD)(e.HY,null,[p,t,o,l,(0,e._)("p",null,[c,(0,e._)("a",i,[r,(0,e.Wm)(a)]),u]),k,(0,e._)("h4",b,[d,m,(0,e._)("a",h,[g,(0,e.Wm)(a)])]),f,(0,e._)("p",null,[(0,e._)("a",x,[y,(0,e.Wm)(a)])]),v,(0,e._)("p",null,[(0,e._)("a",w,[_,(0,e.Wm)(a)]),E]),j,(0,e._)("p",null,[(0,e._)("a",S,[U,(0,e.Wm)(a)]),q])],64)}}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.