2 qq 36376333 qq_36376333 于 2018.08.11 11:06 提问

如何限制java项目在指定主机上运行 5C

springboot项目,现在用混淆加密代码,
同时想要实现在指定服务器上运行,
我想的是在程序启动的时候去获取本地ip,
然后比对ip地址,
相同的话运行,不相同的话程序结束,
但是试了好多种方法获取的都是127.0.0.1,在本地运行的时候获取的是局域网的IP,
想问一下各位大神有没有什么合适的解决方法,
用什么东西做限制无所谓,
只要实现只能在指定服务器运行这个要求就好
用云服务器的MAC地址做绑定可以吗,云服务器的MAC地址会不会更改?
感谢

8个回答

caozhy
caozhy   2018.08.11 12:11

按照你的思路,可以用公网ip,而不是本机ip,用httpclient去访问公网上一个能报告ip的网址(比如ip138),用返回的你服务器的公网ip代替本机ip
还可以用本机的硬盘卷标、主板序列号、mac等。不过这个需要jni去调用原生的代码,并且操作系统平台相关(windows、linux获取的方式不同)

caozhy
caozhy   2018.08.11 17:37

这里有一个借助ip138返回你的出口ip的代码

 public class Test {
    public static void main(String[] args) {
        try {
            String ip1 = getMyIP();
            System.out.println("myIP:" + ip1);
            String ip2 = getMyIPLocal();
            System.out.println("myLocalIP:" + ip2);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }

    private static String getMyIP() throws IOException {
        InputStream ins = null;
        try {
            URL url = new URL("http://iframe.ip138.com/ic.asp");
            URLConnection con = url.openConnection();
            ins = con.getInputStream();
            InputStreamReader isReader = new InputStreamReader(ins, "GB2312");
            BufferedReader bReader = new BufferedReader(isReader);
            StringBuffer webContent = new StringBuffer();
            String str = null;
            while ((str = bReader.readLine()) != null) {
                webContent.append(str);
            }
            int start = webContent.indexOf("[") + 1;
            int end = webContent.indexOf("]");
            return webContent.substring(start, end);
        } finally {
            if (ins != null) {
                ins.close();
            }
        }
    }

    private static String getMyIPLocal() throws IOException {
        InetAddress ia = InetAddress.getLocalHost();
        return ia.getHostAddress();
    }
}
Ding_Ren_
Ding_Ren_   2018.08.11 20:43
qq_31942447
qq_31942447   2018.08.11 22:08

看了你的问题,我觉得你可以换一种思路,你的目的是为了配置固定的服务使用程序,那么你可以在数据库做个配置,比如一个md5加密后的密钥,在程序调用的时候查找比对密钥。类似于这种的。

zhaomin_g
zhaomin_g   2018.08.13 10:40

你需要了解的是如何获取ip地址:
Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
Enumeration inetAddresses = networkInterface.getInetAddresses();
while (inetAddresses.hasMoreElements()) {
InetAddress inetAddress = inetAddresses.nextElement();
if (inetAddress.isLoopbackAddress()) {//回路地址,如127.0.0.1
System.out.println("loop addr:" + inetAddress);
} else if (inetAddress.isLinkLocalAddress()) {//169.254.x.x
System.out.println("link addr:" + inetAddress);
} else {
//非链接和回路真实ip
System.out.println("ip:" + inetAddress);
}
}
}

[点击并拖拽以移动]

结果:

loop addr:/127.0.0.1
loop addr:/0:0:0:0:0:0:0:1
ip:/192.168.10.89

xionglangs
xionglangs   2018.08.13 11:39
zhangyy130
zhangyy130   2018.08.11 15:38

一般可以用网卡地址,即MAC地址。
InetAddress localInetAddress=null;
Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaces.nextElement();
Enumeration inetAddresses = networkInterface.getInetAddresses();
while (inetAddresses.hasMoreElements()) {
InetAddress inetAddress = inetAddresses.nextElement();
if (inetAddress.isLoopbackAddress()) {//回路地址,如127.0.0.1
//xxxxx
} else if (inetAddress.isLinkLocalAddress()) {//169.254.x.x
//
} else {
// Use a non-link local, non-loop back address by default
localInetAddress=inetAddress;
}
}
}
byte[] mac = NetworkInterface.getByInetAddress(localInetAddress).getHardwareAddress();
StringBuffer sb = new StringBuffer("");
for(int i=0; i<mac.length; i++) {
if(i!=0) {
sb.append("-");
}
//字节转换为整数
int temp = mac[i]&0xff;
String str = Integer.toHexString(temp);
System.out.println("每8位:"+str);
if(str.length()==1) {
sb.append("0"+str);
}else {
sb.append(str);
}
}
System.out.println("本机MAC地址:"+sb.toString().toUpperCase());

zhaomin_g
zhaomin_g   2018.08.11 12:30

对ip限制,一般将ip段配置到数据库,程序执行时到库中进行查找匹配

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
idea打包Jar(纯java项目可执行主类)
1、用maven-shade-plugin打包我们这里利用maven中的maven-shade-plugin插件。在pom.xml中,我们加入如下的信息来加入插件。&amp;lt;!-- 配置打可执行的jar --&amp;gt; &amp;lt;plugin&amp;gt; &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt; &amp;lt;artifactI...
eclipse上如何在手机上运行项目
手机要能与电脑相连,当然要安驱动了。效果就是你插入手机,电脑显示驱动已识别。驱动安装的官方教程:http://developer.android.com/sdk/win-usb.html 设置android手机为USB调试模式   步骤: menu—> 设置 —> 应用程序 —> 开发 , 选择【USB调试】 首先打开集成开发环境 连接手机,
sqlserver出错总结
一、关于“验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。” 本地数据库(SqlServer2008)连接不上了,提示“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。”先进入主菜单--〉查看--〉已注册的服务器,在“地服务器组”上点右键--〉新建服务器
手机端运行本地javaweb项目在手机展示
前提条件:电脑和手机在同一个网络环境下。因此这就要求了需要有wifi,①电脑开wifi,手机连接;②或者就是电脑和手机连接相同的wifi。通过cmd窗口,输入命令ipconfig:我的是都用的wifi,因此我要的ip地址就是上图圈中的ip地址。然后把本地运行的连接,例如:localhost:8080/index 改成ip的来链接即:10.0.***.****:8080/index即可。问题:如果手...
通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“connect timed out。请验证连接属性。确保 SQL Server 的实例正在主机上运行,且在此端口
在菜单那边找到SQLServer2014,展开找到SQL Server的配置管理器注意以下操作,以自己连接的服务为准修改之后 重启服务
ERROR:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。请验证连接属性,并检查 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连
本文转载于:file:///C:/Users/Administrator/Desktop/[%E8%BD%AC%E8%BD%BD]%E9%80%9A%E8%BF%87%E7%AB%AF%E5%8F%A3%201433%20%E8%BF%9E%E6%8E%A5%E5%88%B0%E4%B8%BB%E6%9C%BA%20localhost%20%E7%9A%84%20TCP%20IP%20%E8%BF
手机端搭建Java编译运行环境
今天带给大家的是手机端搭建Java编译运行环境(手机党福利)。  众所周知,Java是一种可以撰写跨平台应用软件的面向对象程序设计语言。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。我国也慢悠悠的跟在了世界的屁股后面,随着学习Java的人越来越多,人口慢慢向低龄化趋势发展了。
怎样将自己编的java程序移植到手机上运行? 运行自编经典“Hello World!”
用JBuilder制作jar文件时,选择jad版本信息的时候,应该准确的填写。JBuilder9制作Midlet Suit jar时的MIDP的默认值是2.1,CLDC的默认值是1.1。 n73 Java:MIDP2.0、CLDC 1.1、3D API、PIM API、 5610xm Java MIDP 2.0   下面贴一段java程序的代码,这个小示例程序是在手机的屏幕上写出一行字“H
docker swarm如何在指定节点运行service
Swarm环境中怎么指定某个容器在指定的宿主上运行呢? # 每个 Docker Host 建立时都可以通过 --label 指定其 Docker Daemon 的标签,比如: $ docker daemon \   --label com.example.environment="production" \   --label
Eclipse中Java项目打成jar包,在虚拟机终端上面运行
一、此Java项目中不引用第三方jar包 1、利用Eclipse自带的Export,选择java下的JAR file,选择打成jar包的路径,和Main class。 2、测试(此项目中只有一个Syso"hello world"的类,并且输出语句在主函数中) 二、引用到第三方jar包 (一)、手动打包 1、自定义配置文件MANIFEST.MF(在项目下新建MANIFEST