摘要:在框架中,如何判斷請(qǐng)求是否為協(xié)議請(qǐng)求首先,我們要明白一個(gè)點(diǎn),在官方文檔模塊中,官方闡述了是系統(tǒng)原生的對(duì)象從整篇文檔來(lái)看,模塊并沒(méi)有實(shí)現(xiàn)類似的,的內(nèi)容。因此我們無(wú)法從請(qǐng)求上直接獲取該請(qǐng)求是還是。
在thinkjs框架中,如何判斷請(qǐng)求是否為https協(xié)議請(qǐng)求
首先,我們要明白一個(gè)點(diǎn),在Think-js 官方文檔 2.2 - http模塊中,官方闡述了
http.req , http.res是系統(tǒng)原生的request,response對(duì)象!
從整篇api文檔來(lái)看,http模塊并沒(méi)有實(shí)現(xiàn)類似express的 req.protocol,req.secure的內(nèi)容。因此我們無(wú)法從請(qǐng)求上直接獲取該請(qǐng)求是http還是https。
怎么辦?了解如何獲取協(xié)議類型,我們需要先有一些內(nèi)容需要
https是什么?HTTPS (also called HTTP over TLS, HTTP over SSL,and HTTP Secure]) is a protocol for secure communication over a computer network which is widely used on the Internet.
簡(jiǎn)而言之https就是建立在安全套接層(ssl)或安全傳輸層協(xié)議(tls)上的安全通信協(xié)議,被廣泛應(yīng)用于英特網(wǎng)。不過(guò)目前來(lái)說(shuō),我們真正廣泛使用的是TLS協(xié)議
如果使用TLS,我們?cè)撛趺磁袛?/b>當(dāng)使用TLS的時(shí)候 net.Socket會(huì)收到一個(gè)值為byte 22的頭數(shù)據(jù),該數(shù)據(jù)表明了握手時(shí)使用了TLS協(xié)議
var net = require("net"); var baseAddress = 3000; net.createServer(tcpConnection).listen(baseAddress); function tcpConnection(conn) { conn.once("data", function (buf) { var address = (buf[0] === 22) ? console.log("https") : console.log("http"); }); }); }
顯然這個(gè)不適合我們,因?yàn)槲覀兡壳靶枰氖窃诳刂破骼铽@取到protocol類型。
另一種判斷方法
如果我們?cè)敢夥磌oa或者express的源碼,我們可以很輕易的獲取到我們想要的知識(shí)
以下是express對(duì)protocol的處理
/** * Return the protocol string "http" or "https" * when requested with TLS. When the "trust proxy" * setting trusts the socket address, the * "X-Forwarded-Proto" header field will be trusted * and used if present. * * If you"re running behind a reverse proxy that * supplies https for you this may be enabled. * * @return {String} * @public */ defineGetter(req, "protocol", function protocol(){ var proto = this.connection.encrypted ? "https" : "http"; var trust = this.app.get("trust proxy fn"); if (!trust(this.connection.remoteAddress, 0)) { return proto; } // Note: X-Forwarded-Proto is normally only ever a // single value, but this is to be safe. proto = this.get("X-Forwarded-Proto") || proto; return proto.split(/s*,s*/)[0]; }); /** * Short-hand for: * * req.protocol === "https" * * @return {Boolean} * @public */ defineGetter(req, "secure", function secure(){ return this.protocol === "https"; });
從代碼中我們可以看出,node在使用TLS的時(shí)候,會(huì)在原生的connection對(duì)象上攜帶加密信息,如果非TLS,這個(gè)request.connection.encrypted將會(huì)是undefined。如果express設(shè)置了信任代理,會(huì)先檢測(cè)設(shè)置的信任代理的地址是否與遠(yuǎn)端地址相符,或者頭信息中攜帶"X-Forwarded-Proto"(可能是來(lái)自于Nginx或其他代理時(shí)加上的協(xié)議指示),也會(huì)返回相應(yīng)protocol類型。
在thinkjs中,沒(méi)有類似express app.set("trust proxy")的方法,所以我們直接在控制器里這樣寫就行了
// controller xxx.js "use strict"; import Base from "./base.js"; function getProtocol(http) { let proto = http.req.connection.encrypted ? "https" : "http"; proto = http. header("X-Forwarded-Proto") || proto; return proto.split(/s*,s*/)[0]; } export default class extends Base { /** * index action * @return {Promise} [] */ * indexAction(){ console.log("protocol:", getProtocol(this.http)) } }
整合獲取protocol功能略。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/86776.html
摘要:一入冬懶癌發(fā)作,給自己找點(diǎn)事干。之前博客程序?qū)戇^(guò)幾次,的寫過(guò)兩次,用寫過(guò),隨著版本從升級(jí)到之前的博客程序也做過(guò)升級(jí)。這里主要記錄一下開(kāi)發(fā)過(guò)程中遇到的問(wèn)題和解決方法。后端使用守護(hù)進(jìn)程即可。 一入冬懶癌發(fā)作,給自己找點(diǎn)事干。之前博客程序?qū)戇^(guò)幾次,php 的寫過(guò)兩次,nodejs 用 ThinkJS 寫過(guò),隨著 ThinkJS 版本從1.x 升級(jí)到 2.x 之前的博客程序也做過(guò)升級(jí)。但是因?yàn)?..
摘要:為此框架提供了模型功能,方便操作數(shù)據(jù)庫(kù)。請(qǐng)求攔截統(tǒng)一處理所有的請(qǐng)求和響應(yīng)的,通過(guò)配置為頭部增加字段,其內(nèi)容為,通過(guò)配置,當(dāng)后端接口返回未授權(quán),讓用戶重新登錄。 之前寫過(guò)一篇vue初始化項(xiàng)目,構(gòu)建vuex的后臺(tái)管理項(xiàng)目架子,這個(gè)structure-admin-web所擁有的功能 接下來(lái),針對(duì)structure-admin-web的不足,進(jìn)行了補(bǔ)充,開(kāi)發(fā)了具有登陸的structure-ad...
摘要:最近在用寫自己的博客,發(fā)現(xiàn)總是掉到的坑,于是就好好八一八這個(gè)小甜餅,沒(méi)想到居然還說(shuō)很有意思的,每一個(gè)知識(shí)點(diǎn)都能拉出一條大魚,想想自己之前對(duì),簡(jiǎn)直就是它認(rèn)識(shí)我,我只能叫出他的名字。 最近在用thinkjs寫自己的博客,發(fā)現(xiàn)總是掉到cookie的坑,于是就好好八一八這個(gè)小甜餅,沒(méi)想到居然還說(shuō)很有意思的,每一個(gè)知識(shí)點(diǎn)都能拉出一條大魚,想想自己之前對(duì)cookie,簡(jiǎn)直就是它認(rèn)識(shí)我,我只能叫出他...
摘要:所以我們整理了一個(gè)應(yīng)用安全備忘錄,以幫助你在部署啟動(dòng)應(yīng)用程序的時(shí)候進(jìn)行安全檢查。這可以保護(hù)應(yīng)用程序不被攻擊。應(yīng)該用日志記錄下來(lái),而不是顯示給用戶。 本人的博客http://www.wjs.photo/,感興趣的可以看看哦,基于NodeJs框架ThinkJs 本文翻譯自 www.risingstack.com ,并非逐字逐句的翻譯,有錯(cuò)誤的地方請(qǐng)指出,謝謝啦 應(yīng)用程序的安全就像是你房間里...
閱讀 1604·2019-08-30 13:18
閱讀 1586·2019-08-29 12:19
閱讀 2128·2019-08-26 13:57
閱讀 4152·2019-08-26 13:22
閱讀 1195·2019-08-26 10:35
閱讀 2997·2019-08-23 18:09
閱讀 2517·2019-08-23 17:19
閱讀 689·2019-08-23 17:18