この記事では、Express がどのようにセッションと Cookie を使用するかを主に紹介し、参考として提供します。
ステートレス http
http リクエストとレスポンスは互いに独立しており、サーバーは 2 つの http リクエストが同じユーザーによって送信されたかどうかを識別できないことは誰もが知っています。つまり、サーバーには通信状態を記録する機能がありません。通常、セッション内の両当事者の身元を確認するために Cookie とセッションを使用します。
cookie
cookie は、サーバーからさまざまな識別子を送信し、サーバーは、クライアントによって送信されたこの識別子を通じてユーザーの ID を識別します。その後、ユーザーの関連データがユーザーに送信されます。
express が提供する cookie-parser ミドルウェアをインストールします:
npm i -S cookie-parser
使用するプロジェクト ページ モジュールに cookie-parser プラグインを導入し、次のようにインスタンス化します:
var cookieParser = require('cookie-parser'); var cp = cookieParser(secret, options);
これには 2 つのパラメーターがあり、最初のパラメーターは Secret 、これを使用して Cookie に署名できます。これは、よく Cookie 暗号化と呼ばれるものです。暗号化の原則に精通している学生は、この文字列がサーバーが所有する暗号文であることを知っているはずです。 2 番目のパラメーター オプションには次のオプションのパラメーターが含まれます:
path: Cookie の影響を指定します。 to
expires: 時刻形式を指定します。
maxAge: Cookie がいつ期限切れになるかを指定します。
secure: secure 値が true の場合、それは HTTPS でのみ有効です。それ以外の場合、Cookie は HTTPS でのみ有効です。 HTTP 。
httpOnly: ブラウザでは、スクリプトが document.cookie を操作して Cookie を変更することはできません。 true に設定すると、signedCookie と呼ばれるものによる攻撃を回避できます。
実装コードは次のとおりです:
var path = require('path'); var express = require('express'); var cookieParser = require('cookie-parser'); var app = express(); // 使用 cookieParser 中间件; app.use(cookieParser()); // 如果请求中的 cookie 存在 isFirst // 否则,设置 cookie 字段 isFirst, 并设置过期时间为10秒 app.get('/', function(req, res) { if (req.cookies.isFirst) { res.send("再次欢迎访问"); console.log(req.cookies) } else { res.cookie('isFirst', 1, { maxAge: 60 * 1000}); res.send("欢迎第一次访问"); } }); app.listen(3030, function() { console.log('express start on: ' + 3030) });
上記のコードから、cooke-parser の最初のパラメータでサーバーが提供する暗号化キーを指定できることがわかり、署名された設定を使用できることがわかります。オプションの項目を使用して暗号化を実現します。これは比較的安全ですが、クライアントがリクエストを送信すると、リクエスト ヘッダーのデータ量が増加し、さらにデータ共有ができなくなります。
sessionexpress-sessionは、セッションを作成するために使用されるexpressjsのミドルウェアです。サーバーはセッション ID を生成し、クライアントは Cookie を使用してセッション ID の暗号化されたリクエスト情報を保存し、ユーザーがリクエストしたデータをサーバーに保存します。ただし、ユーザーのデータを暗号化して保存することもできます。クライアント側で。
session は、クライアントとサーバー間のセッション ステータスを記録し、クライアントの ID を判断するために使用されます。 express-session はセッションの保存場所をサポートしています
Cookie、メモリ、または redis や mongodb などのサードパーティ サーバーに保存できます。
セッションはデフォルトでメモリに保存されます。Cookie に保存するのは安全性が低く、非 Redis データベースに保存するのはクエリ速度が遅すぎます。一般的なプロジェクト開発では、セッションは Redis (キャッシュ) に保存されます。データベース)。
express が提供する Express-session ミドルウェア インストール コマンドをインストールします:
var path = require('path'); var express = require('express'); var cookieParser = require('cookie-parser'); var app = express(); // 使用 cookieParser 中间件; app.use(cookieParser('my_cookie_secret')); // cookie app.get('/', function(req, res) { if (req.signedCookies.isFirst) { res.send("欢迎再一次访问"); console.log(req.signedCookies) } else { res.cookie('isFirst', 1, { maxAge: 60 * 1000, signed: true}); res.send("欢迎第一次访问"); } });
使用するプロジェクト ページ モジュールに Express-session プラグインを導入し、次のようにインスタンス化します:
npm i -S express-session
メイン パラメーター オプションの構成項目session() には次のものがあります:
name: セッションのフィールド名を保存するための Cookie を設定します。デフォルトは connect.sid です。
- store: セッションの保存方法、デフォルトは保存されます。
- genid: 新しい session_id を生成するとき、デフォルトで npm パッケージ uid2 が使用されます。
- ローリング: デフォルトは false です。
- resave: セッションが変更されていない場合でも、セッションは保存されます。値、デフォルトは true です
- saveUninitialized: 初期化されていないセッションを強制的にデータベースに保存します
- secret: ハッシュ値を計算します。秘密の文字列を設定し、それを Cookie に配置して、生成された signedCookie を改ざん防止します
- cookie: sessionid を保存する Cookie に関連するオプションを設定します
- それでは、それを使用して何ができるでしょうか?以下、一つずつご紹介していきます。
Cookieセッション
var session = require('express-session'); var se = session(options);signedCookie 構造は次のとおりです:
Session { cookie: { path: '/', _expires: 2018-01-29T17:58:49.950Z, originalMaxAge: 60000, httpOnly: true }, isFirst: 1 }Cookie セッションを実装するコードは次のとおりです:
{ isFirst: '1' }
signed-cookie vs cookie session
signedCookies情報は表示されますが変更できません、Cookie セッションは非表示です。これも変更できませんsignedCookie 情報はクライアントに長期間保存され、後者のクライアントは閉じられると情報が消えます
- 。
针对Cooke session增加了客户端请求的数据规模,我们一般这样使用,数据库存储session。
数据库保存session
用数据库保存session,我们一般使用redis,因为它是缓存数据库,查询速度相较于非缓存的速度更快。
express-session 的实例代码如下:
var path = require('path'); var express = require('express'); var session = require('express-session'); var redisStore = require('connect-redis')(session); var app = express(); // session app.use(session({ name: 'session-name', // 这里是cookie的name,默认是connect.sid secret: 'my_session_secret', // 建议使用 128 个字符的随机字符串 resave: true, saveUninitialized: false, store: new redisStore({ host: '127.0.0.1', port: '6379', db: 0, pass: '', }) })); // route app.get('/', function(req, res) { if (req.session.isFirst) { res.send("欢迎再一次访问。"); console.log(req.session) } else { req.session.isFirst = 1; res.send("欢迎第一次访问。"); } }); app.listen(3030, function() { console.log('express start on: ' + 3030) });
但有时我们也使用非redis数据库保存session,这时我们就需要对项目结构有深刻的认识和理解;否则,使用后反而会适得其反。
另外,我们要注意使用数据库保存session数据,在浏览器端的session-id会随着浏览器的关闭而消失,下次打开浏览器发送请求时,服务器依然不能识别请求者的身份。
cookie session 虽然能解决这个问题,但是它本身存在着安全风险,其实cookie session 和 signedCookies都面临xss攻击。
其实,使用signedCookies和session的结合会在一定程度上降低这样的风险。
signedCookies(cookies) 和 session的结合
在开发中,我们往往需要signedCookies的长期保存特性,又需要session的不可见不可修改的特性。
var path = require('path'); var express = require('express'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var redisStore = require('connect-redis')(session); var app = express(); // 使用 cookieParser 中间件; app.use(cookieParser()); // session app.use(session({ name: 'session-name', // 这里是cookie的name,默认是connect.sid secret: 'my_session_secret', // 建议使用 128 个字符的随机字符串 resave: true, saveUninitialized: false, // cookie: { maxAge: 60 * 1000, httpOnly: true }, store: new redisStore({ host: '127.0.0.1', port: '6379', db: 0, pass: '', }) })); app.get('/', function(req, res, next) { if(req.session.isFirst || req.cookies.isFirst) { res.send("欢迎再一次访问"); } else { req.session.isFirst = 1; res.cookie('isFirst', 1, { maxAge: 60 * 1000, singed: true}); res.send("欢迎第一次访问。"); } }); app.listen(3030, function() { console.log('express start on: ' + 3030) });
这样我们将session保存在redis中的信息,保存在了session_id所标示的客户端cooke中一份,这样我们就不用担心,浏览器关闭,cookie中的session_id字段就会消失的情况,因为浏览器中还有它的备份cookie,如果没有备份的cookie信息,下次客户端再次发出请求浏览就无法确定用户的身份。
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
在vue+iview+less+echarts中实战项目(详细教程)
以上がExpress でセッション メソッドと Cookie メソッドを使用する方法 (詳細なチュートリアル)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

WebStorm Mac版
便利なJavaScript開発ツール

ホットトピック









