提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
由于运营商分配的公网ip经常变化,需要域名绑定,而不喜欢向日葵的DDNS服务,然后跟据官网demo自己写了一个记录一下
一、DDNS是什么?
域名动态解析服务
二、使用步骤
1.引入依赖
代码如下(示例):
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.6.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-alidns -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-alidns</artifactId>
<version>2.6.32</version>
</dependency>
2.编写对应获取ip代码
代码如下(示例):
/**
* 获取主域名的所有解析记录列表
*/
private DescribeDomainRecordsResponse describeDomainRecords(DescribeDomainRecordsRequest request, IAcsClient client){
try {
// 调用SDK发送请求
return client.getAcsResponse(request);
} catch (ClientException e) {
e.printStackTrace();
// 发生调用错误,抛出运行时异常
throw new RuntimeException();
}
}
//如果没有查询到记录,可以用这个方法新增一条解析记录
private AddDomainRecordResponse addDomainRecord(AddDomainRecordRequest request,IAcsClient client){
try {
// 调用SDK发送请求
return client.getAcsResponse(request);
} catch (ClientException e) {
e.printStackTrace();
// 发生调用错误,抛出运行时异常
throw new RuntimeException();
}
}
/**
* 修改解析记录
*/
private UpdateDomainRecordResponse updateDomainRecord(UpdateDomainRecordRequest request, IAcsClient client){
try {
// 调用SDK发送请求
return client.getAcsResponse(request);
} catch (ClientException e) {
e.printStackTrace();
// 发生调用错误,抛出运行时异常
throw new RuntimeException();
}
}
private static void log_print(String functionName, Object result) {
Gson gson = new Gson();
System.out.println("-------------------------------" + functionName + "-------------------------------");
System.out.println(gson.toJson(result));
}
3.获取当前ip,也可以用其他的ip网站,研究发现还是官方demo推荐的好用一点
/**
* 获取当前主机公网IP
*/
private String getCurrentHostIP(){
// 这里使用jsonip.com第三方接口获取本地IP
String jsonip = "https://jsonip.com/";
// 接口返回结果
String result = "";
BufferedReader in = null;
try {
// 使用HttpURLConnection网络请求第三方接口
URL url = new URL(jsonip);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
in = new BufferedReader(new InputStreamReader(
urlConnection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
// 正则表达式,提取xxx.xxx.xxx.xxx,将IP地址从接口返回结果中提取出来
String rexp = "(\\d{1,3}\\.){3}\\d{1,3}";
Pattern pat = Pattern.compile(rexp);
Matcher mat = pat.matcher(result);
String res="";
while (mat.find()) {
res=mat.group();
break;
}
return res;
}
4.对应执行代码,可以写一个定时器定时执行,log_print可以打印返回的数据自己做处理
public static void checkIP() {
// 设置鉴权参数,初始化客户端
DefaultProfile profile = DefaultProfile.getProfile(
"cn-******",//这里可以百度阿里云的地域id
"您的AccessKey ID",// 您的AccessKey ID
"您的AccessKey Secret");// 您的AccessKey Secret
IAcsClient client = new DefaultAcsClient(profile);
DDNS ddns = new DDNS();
// 查询指定二级域名的最新解析记录
DescribeDomainRecordsRequest describeDomainRecordsRequest = new DescribeDomainRecordsRequest();
// 主域名
describeDomainRecordsRequest.setDomainName("******.com");
// 主机记录
describeDomainRecordsRequest.setRRKeyWord("www");
// 解析记录类型
describeDomainRecordsRequest.setType("A");
DescribeDomainRecordsResponse describeDomainRecordsResponse = ddns.describeDomainRecords(describeDomainRecordsRequest, client);
// log_print("describeDomainRecords",describeDomainRecordsResponse);
List<DescribeDomainRecordsResponse.Record> domainRecords = describeDomainRecordsResponse.getDomainRecords();
// 最新的一条解析记录
if(domainRecords.size() != 0 ){
DescribeDomainRecordsResponse.Record record = domainRecords.get(0);
// 记录ID
String recordId = record.getRecordId();
// 记录值
String recordsValue = record.getValue();
// 当前主机公网IP
String currentHostIP = ddns.getCurrentHostIP();
System.out.println("-------------------------------当前主机公网IP为:"+currentHostIP+"-------------------------------");
System.out.println("-------------------------------当前阿里云记录IP为:"+recordsValue+"-------------------------------");
if(!currentHostIP.equals(recordsValue)){
System.out.println("记录不一致开始修改ip");
// 修改解析记录
UpdateDomainRecordRequest updateDomainRecordRequest = new UpdateDomainRecordRequest();
// 主机记录
updateDomainRecordRequest.setRR("www");
// 记录ID
updateDomainRecordRequest.setRecordId(recordId);
// 将主机记录值改为当前主机IP
updateDomainRecordRequest.setValue(currentHostIP);
// 解析记录类型
updateDomainRecordRequest.setType("A");
UpdateDomainRecordResponse updateDomainRecordResponse = ddns.updateDomainRecord(updateDomainRecordRequest, client);
// log_print("updateDomainRecord",updateDomainRecordResponse);
}
}
}