最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java接口簽名(Signature)實(shí)現(xiàn)方案

 更新時(shí)間:2022年01月20日 16:12:05   作者:程序員田同學(xué)  
這篇文章主要介紹了Java接口簽名(Signature)實(shí)現(xiàn)方案?,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

大家好,我是程序員田同學(xué)!

今天上午收到一個(gè)需求,針對(duì)當(dāng)前的系統(tǒng)開發(fā)一個(gè)對(duì)外開放的接口。

既然是對(duì)外開放,那么調(diào)用者一定沒(méi)有我們系統(tǒng)的Token,就需要對(duì)調(diào)用者進(jìn)行簽名驗(yàn)證,簽名驗(yàn)證采用主流的驗(yàn)證方式,采用Signature 的方式。

一、要求

下圖為具體要求

二、流程

?1、線下分配appid和appsecret,針對(duì)不同的調(diào)用方分配不同的appid和appsecret

  2、加入timestamp(時(shí)間戳),10分鐘內(nèi)數(shù)據(jù)有效

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

  4、加入signature,所有數(shù)據(jù)的簽名信息。

三、實(shí)現(xiàn)

簡(jiǎn)單來(lái)說(shuō),調(diào)用者調(diào)用接口業(yè)務(wù)參數(shù)在body中傳遞,header中額外增加四個(gè)參數(shù)signature、appkey、timestamp、noncestr。

我們?cè)诤笈_(tái)取到四個(gè)參數(shù),其后三個(gè)參數(shù)加上調(diào)用者分配的appSecret,使用字典排序并使用MD5加密后與第一個(gè)參數(shù)signature進(jìn)行比對(duì),一致既表示調(diào)用者有權(quán)限調(diào)用。

以下代碼為接口驗(yàn)證簽名的demo實(shí)現(xiàn):

 //引用jackson依賴
    @Autowired
    private ObjectMapper objectMapper;
    @Value("${appsecret}")
    private String appSecret;
  
  /**
     * 驗(yàn)證簽名
     * @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);
		//因?yàn)樾枰判?,直接使用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);
        //簽名比對(duì)
        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("對(duì)象轉(zhuǎn)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轉(zhuǎn)json異常");
        }
        return s2;
    }

到此這篇關(guān)于Java接口簽名(Signature)實(shí)現(xiàn)方案 的文章就介紹到這了,更多相關(guān)Java接口簽名內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java awt實(shí)現(xiàn)計(jì)算器功能

    java awt實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了java awt實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 詳解Java攔截器以及自定義注解的使用

    詳解Java攔截器以及自定義注解的使用

    這篇文章主要為大家介紹了Java攔截器以及自定義注解的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>
    2021-12-12
  • SpringBoot初始教程之Servlet、Filter、Listener配置詳解

    SpringBoot初始教程之Servlet、Filter、Listener配置詳解

    本篇文章主要介紹了SpringBoot初始教程之Servlet、Filter、Listener配置詳解,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-09-09
  • java使用xstream實(shí)現(xiàn)xml文件和對(duì)象之間的相互轉(zhuǎn)換

    java使用xstream實(shí)現(xiàn)xml文件和對(duì)象之間的相互轉(zhuǎn)換

    xml是一個(gè)用途比較廣泛的文件類型,在java里也自帶解析xml的包,但是本文使用的是xstream來(lái)實(shí)現(xiàn)xml和對(duì)象之間的相互轉(zhuǎn)換,xstream是一個(gè)第三方開源框架,使用起來(lái)比較方便,對(duì)java?xml和對(duì)象轉(zhuǎn)換相關(guān)知識(shí)感興趣的朋友一起看看吧
    2023-09-09
  • 5個(gè)JAVA入門必看的經(jīng)典實(shí)例

    5個(gè)JAVA入門必看的經(jīng)典實(shí)例

    這篇文章主要為大家詳細(xì)介紹了5個(gè)JAVA入門必看的經(jīng)典實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 淺談導(dǎo)入JavaWeb 項(xiàng)目出現(xiàn)的問(wèn)題

    淺談導(dǎo)入JavaWeb 項(xiàng)目出現(xiàn)的問(wèn)題

    這篇文章主要介紹了導(dǎo)入JavaWeb 項(xiàng)目出現(xiàn)的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java開發(fā)崗位面試被問(wèn)到反射怎么辦

    Java開發(fā)崗位面試被問(wèn)到反射怎么辦

    這篇文章主要介紹了java 面向?qū)ο竺嬖嚰\的相關(guān)資料,這里整理了面向?qū)ο蟮幕A(chǔ)知識(shí),幫助大家學(xué)習(xí)理解此部分的知識(shí),需要的朋友可以參考下
    2021-07-07
  • Spring將MultipartFile轉(zhuǎn)存到本地磁盤的三種方式

    Spring將MultipartFile轉(zhuǎn)存到本地磁盤的三種方式

    在Java中處理文件向來(lái)是一種不是很方便的操作,然后隨著Spring框架的崛起,使用Spring框架中的MultipartFile來(lái)處理文件也是件很方便的事了,今天就給大家介紹Spring將MultipartFile轉(zhuǎn)存到本地磁盤的方式,需要的朋友可以參考下
    2024-10-10
  • java實(shí)現(xiàn)自定義表格渲染和編輯

    java實(shí)現(xiàn)自定義表格渲染和編輯

    這篇文章主要為大家詳細(xì)介紹了java如何實(shí)現(xiàn)自定義表格渲染和編輯,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Java中的異步回調(diào)問(wèn)題

    Java中的異步回調(diào)問(wèn)題

    這篇文章主要介紹了Java中的異步回調(diào)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論

安顺市| 平阴县| 新丰县| 武平县| 红安县| 石狮市| 上饶县| 静海县| 图片| 晋宁县| 乐都县| 拜城县| 济南市| 巴林左旗| 巴林右旗| 衡东县| 图木舒克市| 莫力| 辉南县| 孝昌县| 安丘市| 宽甸| 平湖市| 阿鲁科尔沁旗| 拉孜县| 阳东县| 常德市| 宕昌县| 扎鲁特旗| 新安县| 德阳市| 黔南| 伊吾县| 庄河市| 平昌县| 宣化县| 牟定县| 吉林省| 喜德县| 砚山县| 陆良县|