2020年的第 15 篇原创文章,来自团队内小伙伴
写在前面
文章来自团队小伙伴在前后端分离的场景下遇到的IP获取的问题及其解决办法。
背景
企业名录访问量突增触发监控,跟踪与分析后,是黑产高频访问所致。企业名录为了支持SEO同步兼顾PC企业详情页访问,去年在原有基础上实施了前后端分离,目前NodeJS Server与后端WEB服务数据交互中获取的是NodeJS Server 的内网IP,不利于防刷处理。
现状是NodeJS Server端做了比较轻量级的IP防刷策略,后端虽有基于流控、风控等比较灵活实时的防刷策略,但部分策略启用需要透传用户ip、cookie等信息,如何通过最小化改动,取得真实的用户ip是需要解决的问题。
方案要求
最小化代码改动:一处修改所有获取ip都生效
满足多种时序:日志中、业务代码、拦截器、流控插件
解决方案
前后端约定规则:(node server获取客户端ip,后端通过约定规则获取)
nodejs server配置(取得客户ip,添加realip参数)
后端添加Filter,核心代码如下:
配置Web.XML Filter
代码测试:
需要注意地方:
为什么使用过滤器,由于项目中Controller、拦截器、过滤器,调用顺序不一致,过滤器通过配置可以做到最早调用,一处替换处处生效。
过滤器不能使用 @WebFilter注解,是因为使用注解的过滤器加载顺序不能保证,据说默认是通过类名排序实现,使用配置可以保证其他过滤器也可以正确取得ip
因IP是通过参数获取,需要保证请求来自内网环境请求,需自行增加内网判定逻辑。否则可能被利用,绕开IP限制。
filter-mapping ip替换过滤器顺序最靠前
仅修改NodeJS server 配置是否可行?
通过实际中与FE多次尝试,基于目前的Nginx配置透传ip 与IP获取策略,多次调整后X-Real-IP获取都是内网IP
失败原因可从nginx配置可知:(即使是内网只要经过nginx就会被覆写)
关于我及张二蛋又要扯蛋了
一个不务正业的程序猿及这个程序猿写字的地方,这里可能有技术,有理财,有历史,有总结,有生活,偶尔也扯扯蛋,妥妥的杂货铺,喜欢可关注。
酒已备好,等你来开