当前位置: 首页 > 科技观察

java实时自动获取动态外网IP并实现跳转,仿shell

时间:2023-03-14 11:37:59 科技观察

前任老板让我帮忙做一个小功能。我以前在那里工作过,关系还不错,一直有联系。基本上,春节也可以到处走走拜年。他目前经营一家客户服务外包公司。他在自己的办公室里买了一台戴尔刀片服务器,上面运行着他公司使用的IVR和呼叫中心系统。由于办公室没有固定IP是动态IP。他使用某个shell动态域名远程访问了这两个系统。最近某shell开始收费,获取到的动态IP错误,导致无法远程访问。他在想能不能给他做一个小软件,可以自动获取办公室的动态IP显示在页面上,这样他就可以通过IP直接访问他办公室服务器上的系统,我就想it,其实也不难,有两种选择,但都需要有固定IP的服务器参与:获取本机的外网IP。IP138、ipinfo等网站很多,获取的发到邮箱或者通过接口指定。直接去服务器;直接定时访问当前机器上的指定服务器,在服务器上可以获取到客户端的IP;而我自己刚好有一台自己买的服务器,可以用,所以我采用第二种方案,比较简单快速。由于客户端是windows系统,所以我使用schtasks和curl来实现。我使用schtasks创建一个定时任务,每1分钟执行一个bat脚本。bat脚本只有一行代码,就是用curl访问我的服务器。API,在这个API中,获取客户端的IP,一起保存。大概流程如下:简单流程图schtasks定时任务脚本:schtasks/create/scminute/mo1/tn"AutoGetIp"/tr"C:\\Users\\BadSmile\\Desktop\\AotuGetIpJob\\getIp.bat"curlscript:curl-s"https://xxx.com/other/ip/v1/reg?group=机器识别,支持多台机器通过不同的识别General&secret=secretkey"这样当本地办公IP改变时,服务器可以及时检测到,服务器处理分为三个接口:ip注册,通过传入不同的组标识,可以支持多台机器使用同一个服务,互不干扰;检查ip,通过传入组,检查指定群组的最新ip信息,或者不传入群组信息,查看所有群组的ip信息;重定向,通过传入group和要重定向的项目名和端口号,通用方便,可以适配不同的项目,适合在一个环境下运行多个服务服务器端代码如下:/***注册IP,不同组的IP分开存放,可以保存多个服务器的IP*@paramgroup*@return*/@RequestMapping(value="v1/reg",method=RequestMethod.GET)@ResponseBodypublicStringreg(@RequestParamStringgroup,@RequestParamStringsecret){log.info("注册ip接口参数,group={}",group);if(SECRET_KEY.equals(secret)){Stringtime=DateTool.dateToStr2(Calendar.getInstance().getTime();Stringkey=CACHE_KEY+group;IPCacheVovo=redisMapper.get(key,IPCacheVo.class);Stringip=getTerminalAddr();if(vo==null){vo=newIPCacheVo();vo.setGroup(组);vo.setIp(ip);vo.setUpdateTime(time);redisMapper.set(key,vo);}else{if(!vo.getIp().equals(ip)){vo.setIp(ip);vo.setUpdateTime(time);redisMapper.set(key,vo);}}returnSUCCESS;}returnFAIL;}/***查看注册的ip列表*@paramgroup*@return*/@RequestMapping(value="v1/get",method=RequestMethod.GET)@ResponseBodypublicStringget(@RequestParam(required=false)Stringgroup){log.info("查看ip接口参数,group={}",group);if(StringUtils.isEmpty(group)){Stringkey=CACHE_KEY+"*";Listvos=redisMapper.values(key,IPCacheVo.class);if(CollectionUtils.isEmpty(vos)){thrownewBizException(OtherResultCode.NOT_FIND_IP_INFO);}else{returnJSON.toJSONString(vos);}}else{Stringkey=CACHE_KEY+group;IPCacheVovo=redisMapper.get(key,IPCacheVo.class);if(vo==null){thrownewBizException(OtherResultCode.NOT_FIND_IP_INFO);}else{returnJSON.toJSONString(vo);}}}/***重定到指定的分组*@paramgroup*@return*/@RequestMapping(value="redirect",method=RequestMethod.GET)publicModelAndViewredirect(@RequestParamStringgroup,@RequestParamStringdomain,@RequestParamStringport){log.info("重指定接口参数,group={},domain={},port={}",group,domain,port);if(StringUtils.isEmpty(group)){thrownewBizException(OtherResultCode.NOT_FIND_IP_INFO);}else{Stringkey=CACHE_KEY+group;IPCacheVovo=redisMapper.get(key,IPCacheVo.class);if(vo==null){thrownewBizException(OtherResultCode.NOT_FIND_IP_INFO);}else{returnnewModelAndView(newRedirectView("http://"+vo.getIp()+":"+port+"/"+domain+"/"));}}}这样就可以解决办公室或者家里没有固定IP但又想要的问题远程访问WEB服务。远程访问时,浏览器可以访问指定地址,如:https://xxxx.com/other/ip/redirect?group=office&domain=callcenter&port=9999会自动重定向到office所在机器的最新外网位于IP上9999端口的callcenter服务上,最终重定向的URL如下:http://实时外网动态IP:9999/callcenter这个只是朋友用到的一个小功能,主要是为了解决他目前遇到的问题,办公室在外网没有固定IP,想从外网访问办公室的内网服务器。当然也可以通过这种方式来实现域名的自动解析。连接某云的域名解析SDK,可以自动检测IP的变化修改域名解析,当然你可以用shell或者shell,这只是一个好玩的小功能,如果你不会不喜欢,不喷,前任老板的反馈还不错