摘要:在框架中,如何判断请求是否为协议请求首先,我们要明白一个点,在官方文档模块中,官方阐述了是系统原生的对象从整篇文档来看,模块并没有实现类似的,的内容。因此我们无法从请求上直接获取该请求是还是。
在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功能略。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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 ,并非逐字逐句的翻译,有错误的地方请指出,谢谢啦 应用程序的安全就像是你房间里...
阅读 1565·2019-08-30 13:18
阅读 1550·2019-08-29 12:19
阅读 2078·2019-08-26 13:57
阅读 4112·2019-08-26 13:22
阅读 1165·2019-08-26 10:35
阅读 2976·2019-08-23 18:09
阅读 2483·2019-08-23 17:19
阅读 664·2019-08-23 17:18