摘要:在框架中,如何判斷請求是否為協議請求首先,我們要明白一個點,在官方文檔模塊中,官方闡述了是系統原生的對象從整篇文檔來看,模塊并沒有實現類似的,的內容。因此我們無法從請求上直接獲取該請求是還是。
在thinkjs框架中,如何判斷請求是否為https協議請求
首先,我們要明白一個點,在Think-js 官方文檔 2.2 - http模塊中,官方闡述了
http.req , http.res是系統原生的request,response對象!
從整篇api文檔來看,http模塊并沒有實現類似express的 req.protocol,req.secure的內容。因此我們無法從請求上直接獲取該請求是http還是https。
怎么辦?了解如何獲取協議類型,我們需要先有一些內容需要
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.
簡而言之https就是建立在安全套接層(ssl)或安全傳輸層協議(tls)上的安全通信協議,被廣泛應用于英特網。不過目前來說,我們真正廣泛使用的是TLS協議
如果使用TLS,我們該怎么判斷當使用TLS的時候 net.Socket會收到一個值為byte 22的頭數據,該數據表明了握手時使用了TLS協議
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"); }); }); }
顯然這個不適合我們,因為我們目前需要的是在控制器里獲取到protocol類型。
另一種判斷方法
如果我們愿意翻看koa或者express的源碼,我們可以很輕易的獲取到我們想要的知識
以下是express對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的時候,會在原生的connection對象上攜帶加密信息,如果非TLS,這個request.connection.encrypted將會是undefined。如果express設置了信任代理,會先檢測設置的信任代理的地址是否與遠端地址相符,或者頭信息中攜帶"X-Forwarded-Proto"(可能是來自于Nginx或其他代理時加上的協議指示),也會返回相應protocol類型。
在thinkjs中,沒有類似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功能略。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86776.html
摘要:一入冬懶癌發作,給自己找點事干。之前博客程序寫過幾次,的寫過兩次,用寫過,隨著版本從升級到之前的博客程序也做過升級。這里主要記錄一下開發過程中遇到的問題和解決方法。后端使用守護進程即可。 一入冬懶癌發作,給自己找點事干。之前博客程序寫過幾次,php 的寫過兩次,nodejs 用 ThinkJS 寫過,隨著 ThinkJS 版本從1.x 升級到 2.x 之前的博客程序也做過升級。但是因為...
摘要:為此框架提供了模型功能,方便操作數據庫。請求攔截統一處理所有的請求和響應的,通過配置為頭部增加字段,其內容為,通過配置,當后端接口返回未授權,讓用戶重新登錄。 之前寫過一篇vue初始化項目,構建vuex的后臺管理項目架子,這個structure-admin-web所擁有的功能 接下來,針對structure-admin-web的不足,進行了補充,開發了具有登陸的structure-ad...
摘要:最近在用寫自己的博客,發現總是掉到的坑,于是就好好八一八這個小甜餅,沒想到居然還說很有意思的,每一個知識點都能拉出一條大魚,想想自己之前對,簡直就是它認識我,我只能叫出他的名字。 最近在用thinkjs寫自己的博客,發現總是掉到cookie的坑,于是就好好八一八這個小甜餅,沒想到居然還說很有意思的,每一個知識點都能拉出一條大魚,想想自己之前對cookie,簡直就是它認識我,我只能叫出他...
摘要:所以我們整理了一個應用安全備忘錄,以幫助你在部署啟動應用程序的時候進行安全檢查。這可以保護應用程序不被攻擊。應該用日志記錄下來,而不是顯示給用戶。 本人的博客http://www.wjs.photo/,感興趣的可以看看哦,基于NodeJs框架ThinkJs 本文翻譯自 www.risingstack.com ,并非逐字逐句的翻譯,有錯誤的地方請指出,謝謝啦 應用程序的安全就像是你房間里...
閱讀 1594·2019-08-30 13:18
閱讀 1582·2019-08-29 12:19
閱讀 2120·2019-08-26 13:57
閱讀 4146·2019-08-26 13:22
閱讀 1189·2019-08-26 10:35
閱讀 2995·2019-08-23 18:09
閱讀 2508·2019-08-23 17:19
閱讀 685·2019-08-23 17:18