广告位联系
返回顶部
分享到

Java如何提供给第三方使用接口方法的介绍

java 来源:互联网 作者:佚名 发布时间:2022-08-23 19:56:44 人浏览
摘要

前言 相信有很多小伙伴,在日常的开发中都有遇到过需要调用第三方接口的需求吧,但是自己有没有写过接口提供给第三方使用呢,常规的都是我们调用别人的接口,但是自己需要开发

前言

相信有很多小伙伴,在日常的开发中都有遇到过需要调用第三方接口的需求吧,但是自己有没有写过接口提供给第三方使用呢,常规的都是我们调用别人的接口,但是自己需要开发接口提供给第三方使用的场景应该不是很多,很多小伙伴可能会想不就开发一个接口对外开放嘛岂不是很简单,但是在开发接口对外开放,我们需要考虑一个问题,没有限制条件,那岂不是太不安全了,谁都可以调我这个接口了啊。

所以接下来的就是我们需要考虑的问题了,在开发接口的时候就要考虑到安全性的问题,那么应该如何去解决这个问题呢?提供接口给第三方使用的时候需要加上校验保证接口的安全性。

下面是我写的一个例子希望对大家有帮助。

接口Controller

在写接口前一定要签名做签名校验,我的签名方式做了特殊处理,因为接口是对外开放的,这个是为了避免恶意调用接口做的处理,叫做签名的混淆值,这个签名混淆值的作用是就算别人知道了接口,并且知道签名方式也不能被攻击,是为了避免被恶意篡改数据,签名混淆值就是一组特定加密后的数据。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

@PostMapping("refundDeductionPoints")

public Result<SysIntegralStatement> refundDeductionPoints (@RequestParam Map<String,String> params){

    Result<SysIntegralStatement> result = new Result<SysIntegralStatement>();

    try {

        //签名校验

        String msgDigest = params.get("msgDigest");//签名

        String msgData = params.get("msgData");

        String timeStamp = params.get("timeStamp");

        String secret = params.get("secret");// 秘钥

        String sign = SignUtil.sign(msgData+"wf8la1tw7p9o2xz",timeStamp);//wf8la1tw7p9o2xz为签名混淆值

        if (!msgDigest.equals(sign)) {

            return result.setCode(1006).setReason("数字签名无效");

        }

        if (Common.isEmpty(secret)) {//先签名后幂等校验

            return result.setCode(1001).setReason("密钥不能为空");

        }

        /**

         * 幂等校验

         * 1.同一个用户操作同一个退货单一分钟内操作该单据视为重复操作(此秘钥已通过特殊处理)

         */

        String value = redistempalte.opsForValue().get(secret);

        if (Common.isNotEmpty(value)) {

            logger.error("重复请求 secret={}",value);

            return result.setCode(1007).setReason("重复请求"); 

        }

        redistempalte.opsForValue().set(secret, "1",60,TimeUnit.SECONDS);//设置缓存一分钟

        return service.refundDeductionPoints(params);

    } catch (Exception e) {

        logger.error("添加积分流水异常", e);

        return result.setCode(ErrorCodes.BUSINESS_ERROR).setReason("生成积分流水失败");

    }

}

接口幂等性校验

此接口做幂等性校验,幂等性校验常见解决方案有很多,可以自行根据实际情况选择,

说到幂等首先要先了解什么是幂等

概念:

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。

在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。

这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()和setTrue()”函数就是一个幂等函数.

幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次,比如:

订单接口, 不能多次创建订单

支付接口, 重复支付同一笔订单只能扣一次钱

支付宝回调接口, 可能会多次回调, 必须处理重复回调

普通表单提交接口, 因为网络超时等原因多次点击提交, 只能成功一次

等等

解决方案常见的几种方式

唯一索引 – 防止新增脏数据

token机制 – 防止页面重复提交

悲观锁 – 获取数据的时候加锁(锁表或锁行)

乐观锁 – 基于版本号version实现, 在更新数据那一刻校验数据

分布式锁 – redis(jedis、redisson)或zookeeper实现

状态机 – 状态变更, 更新数据时判断状态

如果有小伙伴不理解什么是幂等可以看看官方是解释

实现类ServiceImpl

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

@Transactional

@Override

public Result<SysIntegralStatement> refundDeductionPoints(Map<String, String> params) {

    String msgData = params.get("msgData");

    ParamIntegral entity = new Gson().fromJson(msgData, ParamIntegral.class);

    if (Common.isNull(entity)) {

        return new Result<SysIntegralStatement>().setCode(ErrorCodes.INNER_ERROR).setReason("请求参数不能为空");

    }

    if (Common.isEmpty(entity.getBitems())) {

        return new Result<SysIntegralStatement>().setCode(ErrorCodes.INNER_ERROR).setReason("请求参数不能为空");

    }

    int row = 0;

    for (ParamIntegral bitem : entity.getBitems()) {

        if (Common.isEmpty(bitem.getDdh())) {

            return new Result<SysIntegralStatement>().setCode(ErrorCodes.INNER_ERROR).setReason("订单号为必传参数");

        }

        if (null == bitem.getJfz()) {

            return new Result<SysIntegralStatement>().setCode(ErrorCodes.INNER_ERROR).setReason("扣减积分不能为空");

        }

        List<MallOrderInfo> orderInfo = mallOrderInfoMapper.selectByDdh(bitem.getDdh());

        if (orderInfo == null) {

            return new Result<SysIntegralStatement>().setCode(ErrorCodes.INNER_ERROR)

                    .setReason("订单号为" + bitem.getDdh() + "没有此订单请联系客服核对信息。");

        }

        if (orderInfo != null && orderInfo.size() > 1) {

            return new Result<SysIntegralStatement>().setCode(ErrorCodes.INNER_ERROR)

                    .setReason("订单号为" + bitem.getDdh() + "有多个相同订单请联系客服核对信息。");

        }

        if (!"E".equals(orderInfo.get(0).getDdzt())) {

            return new Result<SysIntegralStatement>().setCode(ErrorCodes.INNER_ERROR)

                    .setReason("订单号为" + bitem.getDdh() + "未确认收货还没产生积分不允许退货。");

        }

        SysIntegral integral = Common.first(integralMapper.selectByMdbm(orderInfo.get(0).getMdbm()));

        if (integral == null) {

            return new Result<SysIntegralStatement>().setCode(ErrorCodes.INNER_ERROR)

                    .setReason("门店编码为" + orderInfo.get(0).getMdbm() + "积分汇总没有找到此门店,请联系客服核实");

        }

        BigDecimal kyjf = BigDecimal.ZERO;

        if (entity.getReturnGoods() == true) {

            // 可用积分小于扣减积分不够扣ERP使用前抵扣

            if (bitem.getJfz().compareTo(integral.getKyjf()) == 1) {

                kyjf = BigDecimal.ZERO;                

            } else {

                // 可用积分 = 当前可用积分-扣减积分

                kyjf = Common.nvl(integral.getKyjf(), BigDecimal.ZERO).subtract(bitem.getJfz());

            }

        } else {

            // 可用积分 = 当前可用积分+退还积分

            kyjf = Common.nvl(integral.getKyjf(), BigDecimal.ZERO).add(bitem.getJfz());            

        }      

        // 更新积分汇总

        SysIntegral dataMap = new SysIntegral();

        dataMap.setIntegralId(integral.getIntegralId());

        dataMap.setMdbm(integral.getMdbm());

        dataMap.setKyjf(kyjf);

        dataMap.setUpdateTime(new Date());

        dataMap.setUpdateUser(entity.getUserName());

        dataMap.setUpdateUserid(entity.getUserId().intValue());    

        row = integralMapper.updateByPrimaryKeySelective(dataMap);

        if (row == 0) {

            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

            return new Result<SysIntegralStatement>().setCode(ErrorCodes.INNER_ERROR).setReason("更新积分失败");

        }

        //推送到ERP门店信息

         BdMdxxH mdxx =new BdMdxxH();

         mdxx.setMdbm(integral.getMdbm());

         mdxx.setMdjf(kyjf);

        com.lkfs.cw.common.Result<BdMdxxH> bdMdxxh = dataBaseServiceApi.updateStorePoints(mdxx);

        if (!bdMdxxh.isComplete()) {

            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

            return new Result<SysIntegralStatement>().setCode(bdMdxxh.getCode()).setReason(bdMdxxh.getReason());

        }      

        SysIntegralStatement statement = new SysIntegralStatement();

        if (entity.getReturnGoods() == true) {

            statement.setJfz(bitem.getJfz().negate());// 消费的积分值

            if (bitem.getJfz().compareTo(integral.getKyjf()) == 1) {// 可用积分小于扣减积分不够扣ERP使用前抵扣

                statement.setTzhjfz(BigDecimal.ZERO);// 调整后积分值

            } else {

                statement.setTzhjfz(Common.nvl(integral.getKyjf(), BigDecimal.ZERO).subtract(bitem.getJfz()));// 调整后积分值

            }

            statement.setJfxflx("E");// 积分支出

            statement.setXxsm("退货扣减积分(订单号为:" + bitem.getDdh() + "," + "退货单号为:" + entity.getDjh() + ")" + "已扣除:"

                    + bitem.getJfz().negate() + ":积分");

        } else {// 取消退货

            statement.setJfxflx("I");// 积分收入

            statement.setJfz(bitem.getJfz());// 取消退货把积分赠送回来

            statement.setTzhjfz(Common.nvl(integral.getKyjf(), BigDecimal.ZERO).add(bitem.getJfz()));// 调整后积分值

            statement.setXxsm("取消退货(订单号为:" + bitem.getDdh() + "," + "退货单号为:" + entity.getDjh() + ")" + "已退还:"

                    + bitem.getJfz() + ":积分");

        }

        statement.setIntegralId(integral.getIntegralId());// 该门店积分编码

        statement.setTzqjfz(integral.getKyjf());// 调整前积分值

        statement.setDdh(entity.getDdh());

        statement.setCreateTime(new Date());// 流水生成时间

        statement.setCreateUser(entity.getUserName());

        statement.setCreateUserid(entity.getUserId().intValue());

        statement.setJftz("T");// 积分扣减为T

        statement.setZt("Y");// 状态 Y:有效

        row = mapper.insert(statement);

        if (row == 0) {

            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

            return new Result<SysIntegralStatement>().setCode(ErrorCodes.INNER_ERROR).setReason("插入积分流水失败");

        }

    }

    return new Result<SysIntegralStatement>().setCode(ErrorCodes.SUCCESS).setReason("操作成功");

}

第三方调用接口Api实现类

模拟第三方合作方调用接口

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

//此方式以上已写了封装信息就不一一展示了,可以根据实际情况自行操作

    private void pushIntegral(Long djlsh) {

        FiSjysjsH fiSjysjsh = mapper.selectByPrimaryKey(djlsh);            

        //订单退货调用某某退货扣减积分接口

        List<FiSjysjsB> sjysjsbList = bmapper.selectByKhddh(djlsh);

        if (sjysjsbList != null && sjysjsbList.size() > 0) {

            List<ParamIntegral> list = new ArrayList<ParamIntegral>();

            for (FiSjysjsB bitem : sjysjsbList) {

                ParamIntegral temp = new ParamIntegral();

                temp.setDdh(bitem.getKhddh());

                temp.setJfz(bitem.getJfz());           

                list.add(temp);

            }

            ParamIntegral param = new ParamIntegral();

            param.setBitems(list);

            param.setDjh(fiSjysjsh.getDjh());

            param.setUserId(AppRealm.getCurrentUser().getUserId());

            param.setUserName(AppRealm.getCurrentUser().getUserName());

            if (new Short("1").equals(fiSjysjsh.getLocked())) {

                param.setReturnGoods(true);

            }else {

                param.setReturnGoods(false);

            }

            String msgData = new Gson().toJson(param).toString();

            Map<String, String> params = new HashMap<String, String>();

            String timeStamp = String.valueOf(System.currentTimeMillis());//时间戳

            params.put("timeStamp", timeStamp);

            params.put("msgData", msgData);

            params.put("msgDigest", SignUtil.sign(msgData+"wf8la1tw7p9o2xz", timeStamp));//生成签名第二个值暂定(wf8la1tw7p9o2xz签名混淆值)

            params.put("secret",IDEMPOTENT_SECRET_PREFIX + fiSjysjsh.getDjh() + AppRealm.getCurrentUser().getUserId()+param.getReturnGoods() );//自定义密钥 做幂等校验

            String result = HttpCilent.post(B2B_URL, params); //发送http post请求

            B2bIntegralResponse res = new Gson().fromJson(result, B2bIntegralResponse.class);

            if (null == res) {

                throw new RuntimeException("调用积分接口系统异常");

            }

            if (res.getCode() != 0) {//接口返回失败异常代码提示

                throw new RuntimeException("调用积分接口发生异常,异常代码为:"+res.getCode()+"异常信息为:"+res.getReason());

            }

        }

    }

生成签名工具类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

package com.cy.xgsm.util;

 

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

 

import com.google.gson.JsonElement;

import com.google.gson.JsonObject;

import com.google.gson.JsonParser;

 

/**

 *

 * @author Dylan

 *

 */

public class SignUtil {

     

private static final Logger log = LoggerFactory.getLogger(SignUtil.class);

     

    /**

     *

     */

    public static String sign(String str, String secret) {

        StringBuilder enValue = new StringBuilder();

        enValue.append(secret);

        enValue.append(str);

        enValue.append(secret);

        return encryptByMD5(enValue.toString());

    }

 

    private static String encryptByMD5(String data) {

        String re_md5 = new String();

        try {

            MessageDigest md = MessageDigest.getInstance("MD5");

            md.update(data.getBytes());

            byte b[] = md.digest();

            int i;

            StringBuffer buf = new StringBuffer();

            for (int offset = 0; offset < b.length; offset++) {

                i = b[offset];

                if (i < 0)

                    i += 256;

                if (i < 16)

                    buf.append("0");

                buf.append(Integer.toHexString(i));

            }

            re_md5 = buf.toString();

        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        }

        return re_md5.toUpperCase();

    }

 

    public static String compare(String jsonStr,String secret ){

 

        JsonParser jsonParser = new JsonParser();

        JsonObject jsonObject = jsonParser.parse(jsonStr).getAsJsonObject();

        String sign1 = "null";

        JsonElement signElement = jsonObject.remove("sign");

        if( signElement != null ){

            sign1 = signElement.getAsString();

        }

        log.info("sign1: " + sign1);

        StringBuilder enValue = new StringBuilder();

        enValue.append(secret);

        enValue.append(jsonObject.toString());

        enValue.append(secret);

        String sign2 = encryptByMD5(enValue.toString());

        jsonObject.addProperty("sign", sign2);

        return jsonObject.toString();

    }

}

HttpCilent工具类

这个工具类在我之前的文章也有但是没有把这个方式的放上去,如果有需要用到可直接把一下代码复制到这个Http工具类(见文末) 最后即可直接使用。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

/**

  * 发送post请求

  * @param url 目的url

  * @param parameters 参数

  * @return

  */

 public static String post(String url, Map<String, String> parameters) {

     String result = "";// 返回的结果

     BufferedReader in = null;// 读取响应输入流

     PrintWriter out = null;

     StringBuffer sb = new StringBuffer();// 处理请求参数

     String params = "";// 编码之后的参数

     try {

     // 编码请求参数

     if (parameters.size() == 1) {

     for (String name : parameters.keySet()) {

     sb.append(name)

     .append("=")

     .append(java.net.URLEncoder.encode(

     parameters.get(name), "UTF-8"));

     }

     params = sb.toString();

     } else {

     for (String name : parameters.keySet()) {

     sb.append(name)

     .append("=")

     .append(java.net.URLEncoder.encode(

     parameters.get(name), "UTF-8")).append("&");

     }

     String temp_params = sb.toString();

     params = temp_params.substring(0, temp_params.length() - 1);

     }

     // 创建URL对象

     java.net.URL connURL = new java.net.URL(url);

     // 打开URL连接

     java.net.HttpURLConnection httpConn = (java.net.HttpURLConnection) connURL

     .openConnection();

     // 设置通用属性

     httpConn.setRequestProperty("Accept", "*/*");

     httpConn.setRequestProperty("Connection", "Keep-Alive");

     httpConn.setRequestProperty("content-type", "application/x-www-form-urlencoded");

     httpConn.setRequestProperty("User-Agent",

     "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");

     // 设置POST方式

     httpConn.setDoInput(true);

     httpConn.setDoOutput(true);

     // 获取HttpURLConnection对象对应的输出流

     out = new PrintWriter(httpConn.getOutputStream());

     // 发送请求参数

     out.write(params);

     // flush输出流的缓冲

     out.flush();

     // 定义BufferedReader输入流来读取URL的响应,设置编码方式

     in = new BufferedReader(new InputStreamReader(

     httpConn.getInputStream(), "UTF-8"));

     String line;

     // 读取返回的内容

     while ((line = in.readLine()) != null) {

     result += line;

     }

     } catch (Exception e) {

     e.printStackTrace();

 

     } finally {

     try {

     if (out != null) {

     out.close();

     }

     if (in != null) {

     in.close();

     }

     } catch (IOException ex) {

     ex.printStackTrace();

     }

     }

     return result;

     }

附:分享一个获取IP工具类

在日常开发中,经常会遇到需要记录IP的需求,接下来分享一个获取IP工具类,希望对小伙伴有帮助

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

package com.cy.xgsm.util;

 

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.net.InetAddress;

import java.net.UnknownHostException;

import javax.servlet.http.HttpServletRequest;

 

/**

 * 获取IP工具类

 * @author Dylan

 *

 */

public class IpUtils {

     

    private static Logger logger = LoggerFactory.getLogger(IpUtils.class);

 

    /**

     * 获取IP地址

     * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址

     * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址

     */

    public static String getIpAddr(HttpServletRequest request)

    {

        if (request == null)

        {

            return "unknown";

        }

        String ip = request.getHeader("x-forwarded-for");

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))

        {

            ip = request.getHeader("Proxy-Client-IP");

        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))

        {

            ip = request.getHeader("X-Forwarded-For");

        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))

        {

            ip = request.getHeader("WL-Proxy-Client-IP");

        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))

        {

            ip = request.getHeader("X-Real-IP");

        }

 

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))

        {

            ip = request.getRemoteAddr();

        }

 

        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip;

    }

 

    public static boolean internalIp(String ip)

    {

        byte[] addr = textToNumericFormatV4(ip);

        return internalIp(addr) || "127.0.0.1".equals(ip);

    }

 

    private static boolean internalIp(byte[] addr)

    {

        if (StringUtils.isNull(addr) || addr.length < 2)

        {

            return true;

        }

        final byte b0 = addr[0];

        final byte b1 = addr[1];

        final byte section1 = 0x0A;

        final byte section2 = (byte) 0xAC;

        final byte section3 = (byte) 0x10;

        final byte section4 = (byte) 0x1F;

        final byte section5 = (byte) 0xC0;

        final byte section6 = (byte) 0xA8;

        switch (b0)

        {

            case section1:

                return true;

            case section2:

                if (b1 >= section3 && b1 <= section4)

                {

                    return true;

                }

            case section5:

                switch (b1)

                {

                    case section6:

                        return true;

                    default:

                        return false;   

                }

            default:

                return false;

        }

    }

 

    /**

     * 将IPv4地址转换成字节

     *

     * @param text IPv4地址

     * @return byte 字节

     */

    public static byte[] textToNumericFormatV4(String text)

    {

        if (text.length() == 0)

        {

            return null;

        }

 

        byte[] bytes = new byte[4];

        String[] elements = text.split("\\.", -1);

        try

        {

            long l;

            int i;

            switch (elements.length)

            {

                case 1:

                    l = Long.parseLong(elements[0]);

                    if ((l < 0L) || (l > 4294967295L)){

                        return null;

                    }

                    bytes[0] = (byte) (int) (l >> 24 & 0xFF);

                    bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);

                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);

                    bytes[3] = (byte) (int) (l & 0xFF);

                    break;

                case 2:

                    l = Integer.parseInt(elements[0]);

                    if ((l < 0L) || (l > 255L)){

                        return null;

                    }

                    bytes[0] = (byte) (int) (l & 0xFF);

                    l = Integer.parseInt(elements[1]);

                    if ((l < 0L) || (l > 16777215L)){

                        return null;

                    }

                    bytes[1] = (byte) (int) (l >> 16 & 0xFF);

                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);

                    bytes[3] = (byte) (int) (l & 0xFF);

                    break;

                case 3:

                    for (i = 0; i < 2; ++i)

                    {

                        l = Integer.parseInt(elements[i]);

                        if ((l < 0L) || (l > 255L)){

                            return null;

                        }

                        bytes[i] = (byte) (int) (l & 0xFF);

                    }

                    l = Integer.parseInt(elements[2]);

                    if ((l < 0L) || (l > 65535L)){

                        return null;

                    }

                    bytes[2] = (byte) (int) (l >> 8 & 0xFF);

                    bytes[3] = (byte) (int) (l & 0xFF);

                    break;

                case 4:

                    for (i = 0; i < 4; ++i)

                    {

                        l = Integer.parseInt(elements[i]);

                        if ((l < 0L) || (l > 255L)){

                            return null;

                        }

                        bytes[i] = (byte) (int) (l & 0xFF);

                    }

                    break;

                default:

                    return null;

            }

        }

        catch (NumberFormatException e)

        {

            return null;

        }

        return bytes;

    }

 

    public static String getHostIp()

    {

        try

        {

            return InetAddress.getLocalHost().getHostAddress();

        }

        catch (UnknownHostException e)

        {

        }

        return "127.0.0.1";

    }

 

    public static String getHostName()

    {

        try

        {

            return InetAddress.getLocalHost().getHostName();

        }

        catch (UnknownHostException e)

        {

        }

        return "未知";

    }

}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/weixin_45731661/article/details/126341900
相关文章
  • SpringBoot自定义错误处理逻辑介绍

    SpringBoot自定义错误处理逻辑介绍
    1. 自定义错误页面 将自定义错误页面放在 templates 的 error 文件夹下,SpringBoot 精确匹配错误信息,使用 4xx.html 或者 5xx.html 页面可以打印错误
  • Java实现手写一个线程池的代码

    Java实现手写一个线程池的代码
    线程池技术想必大家都不陌生把,相信在平时的工作中没有少用,而且这也是面试频率非常高的一个知识点,那么大家知道它的实现原理和
  • Java实现断点续传功能的代码

    Java实现断点续传功能的代码
    题目实现:网络资源的断点续传功能。 二、解题思路 获取要下载的资源网址 显示网络资源的大小 上次读取到的字节位置以及未读取的字节
  • 你可知HashMap为什么是线程不安全的
    HashMap 的线程不安全 HashMap 的线程不安全主要体现在下面两个方面 在 jdk 1.7 中,当并发执行扩容操作时会造成环形链和数据丢失的情况 在
  • ArrayList的动态扩容机制的介绍

    ArrayList的动态扩容机制的介绍
    对于 ArrayList 的动态扩容机制想必大家都听说过,之前的文章中也谈到过,不过由于时间久远,早已忘却。 所以利用这篇文章做做笔记,加
  • JVM基础之字节码的增强技术介绍

    JVM基础之字节码的增强技术介绍
    字节码增强技术 在上文中,着重介绍了字节码的结构,这为我们了解字节码增强技术的实现打下了基础。字节码增强技术就是一类对现有字
  • Java中的字节码增强技术

    Java中的字节码增强技术
    1.字节码增强技术 字节码增强技术就是一类对现有字节码进行修改或者动态生成全新字节码文件的技术。 参考地址 2.常见技术 技术分类 类
  • Redis BloomFilter布隆过滤器原理与实现

    Redis BloomFilter布隆过滤器原理与实现
    Bloom Filter 概念 布隆过滤器(英语:Bloom Filter)是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射
  • Java C++算法题解leetcode801使序列递增的最小交换次

    Java C++算法题解leetcode801使序列递增的最小交换次
    题目要求 思路:状态机DP 实现一:状态机 Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution { public int minSwap(int[] nums1, int[] nums2) { int n
  • Mybatis结果集映射与生命周期介绍

    Mybatis结果集映射与生命周期介绍
    一、ResultMap结果集映射 1、设计思想 对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了 2、resultMap的应用场
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计