亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java接口簽名如何實現

發布時間:2022-01-21 09:17:26 來源:億速云 閱讀:394 作者:小新 欄目:開發技術

這篇文章給大家分享的是有關Java接口簽名如何實現的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

一、要求

下圖為具體要求

Java接口簽名如何實現

二、流程

1、線下分配appid和appsecret,針對不同的調用方分配不同的appid和appsecret

  2、加入timestamp(時間戳),10分鐘內數據有效

  3、加入流水號noncestr(防止重復提交),至少為10位。針對查詢接口,流水號只用于日志落地,便于后期日志核查。 針對辦理類接口需校驗流水號在有效期內的唯一性,以避免重復請求。

  4、加入signature,所有數據的簽名信息。

Java接口簽名如何實現

三、實現

簡單來說,調用者調用接口業務參數在body中傳遞,header中額外增加四個參數signature、appkey、timestamp、noncestr。

我們在后臺取到四個參數,其后三個參數加上調用者分配的appSecret,使用字典排序并使用MD5加密后與第一個參數signature進行比對,一致既表示調用者有權限調用。

以下代碼為接口驗證簽名的demo實現:

 //引用jackson依賴
    @Autowired
    private ObjectMapper objectMapper;
    @Value("${appsecret}")
    private String appSecret;
  
  /**
     * 驗證簽名
     * @param preInfoItem
     * @return
     */
    boolean checkSignature(PreInfoItem preInfoItem) throws JsonProcessingException, IllegalAccessException {
        String signature="signature";
        String appkey="appkey";
        String timestamp="timestamp";
        String noncestr="noncestr";
        HttpServletRequest request = ServletUtils.getRequest();
        String headerSignature = request.getHeader(signature);
        String headerAppkey = request.getHeader(appkey);
        String headerTimestamp = request.getHeader(timestamp);
        String headerNoncestr = request.getHeader(noncestr);
		//因為需要排序,直接使用TreeMap
        Map<String,Object> parms=new TreeMap<>();
        parms.put(appkey,headerAppkey);
        parms.put(timestamp,headerTimestamp);
        parms.put(noncestr,headerNoncestr);
        Map<String, Object> stringObjectMap = objectToMap(parms, preInfoItem);
        String s = buildSignature(stringObjectMap);
        //簽名比對
        if (s.equals(headerSignature)){
            return true;
        }
        return false;
    }
    Map<String,Object> objectToMap(Map<String,Object> map,Object o){
        Field[] declaredFields = o.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            field.setAccessible(true);
            try {
                if (field.getName() instanceof String){
                    map.put(field.getName(),field.get(o));
                }
            }catch (IllegalAccessException e){
                throw new CustomException("對象轉map異常");
            }
        }
        return map;
    }
  private String buildSignature(Map<String,Object> maps){
      String s2;
      try {
            StringBuffer s = null;
            String s1 = objectMapper.writeValueAsString(maps);
            //添加appSecret
            s.append(s1).append(appSecret);
             s2 = DigestUtils.md5DigestAsHex(s.toString().getBytes());
        }catch (JsonProcessingException e){
            throw new CustomException("map轉json異常");
        }
        return s2;
    }

感謝各位的閱讀!關于“Java接口簽名如何實現”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平乡县| 白朗县| 淮滨县| 全州县| 乐至县| 望江县| 革吉县| 炉霍县| 施秉县| 诸城市| 胶南市| 晋州市| 洱源县| 阿拉善左旗| 芮城县| 梁河县| 曲松县| 浮梁县| 合作市| 连云港市| 防城港市| 远安县| 宝兴县| 来宾市| 花莲市| 修水县| 临洮县| 连城县| 仪征市| 西昌市| 右玉县| 玛纳斯县| 尼玛县| 靖州| 甘洛县| 雅安市| 镇宁| 获嘉县| 临湘市| 汤阴县| 乐平市|