首页 > 其他 > 详细

koa中是如何封装获取客户端IP的?

时间:2020-07-11 23:59:19      阅读:153      评论:0      收藏:0      [点我收藏+]

案例

var koa = require(‘koa‘)
var app = new koa()
app.use(function (ctx,next) {
	ctx.body = ctx.ip
})
app.listen(‘9090‘)

同时nginx设置代理:

server {
	listen 8062;
	server_name localhost;
  proxy_set_header X-Forwarded-For "110.11.11.11,11,11,11,11";
	location / {
		proxy_pass http://127.0.0.1:9090;
  }
}

本地访问localhost:8062的结果:::ffff:127.0.0.1

这个结果是怎么来的呢?

koa处理ip

主要是下面的程序

// application.js
this.proxy = options.proxy || false;
this.proxyIpHeader = options.proxyIpHeader || ‘X-Forwarded-For‘;
this.maxIpsCount = options.maxIpsCount || 0;

// request.js
get ip() {
	if (!this[IP]) {
		this[IP] = this.ips[0] || this.socket.remoteAddress || ‘‘;
	}
	return this[IP];
},
  
get ips() {
		const proxy = this.app.proxy;
		const val = this.get(this.app.proxyIpHeader);
		let ips = proxy && val
			? val.split(/\s*,\s*/)
			: [];
		if (this.app.maxIpsCount > 0) {
			ips = ips.slice(-this.app.maxIpsCount);
		}
		return ips;
	},

变量解释:

proxy: default false;当proxy为false的时候, getter ips 返回一个空数组,getter ip 返回this.socket.remoteAddress;

proxyIpHeader: 自定义IpHeader,用来接收消息头中的ip,默认"X-Forwarded-For";当proxy为true的时候 ,程序会解析消息头 "X-Forwarded-For"中的值,假如这个值是"client, proxy1, proxy2",经过解析后 getter ips返回数组 ["client", "proxy1", "proxy2"]。getter ip 返回this.ips[0]即"client";

maxIpsCount:maxIpsCount默认值为0,不太明白这个选项的使用场景

总结:

如果开发者认为请求来自于代理服务器的转发,需要设定proxy:true,再设置对应的proxyIpHeader(毕竟不是都是X-Forwarded-For),然后获取客户端IP;

如果开发者认为中间没有代理服务器,那么程序会直接取remoteAddress来获取客户端IP。

那么又有个疑问,express是如果获取IP的呢?

如有错误之处,望请斧正。

koa中是如何封装获取客户端IP的?

原文:https://www.cnblogs.com/walkermag/p/13285929.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!