详解Java接口签名(Signature)实现方案

 更新时间:2022年01月20日 16:12:05   作者:程序员田同学  
这篇文章主要介绍了Java接口签名(Signature)实现方案 ,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

大家好,我是程序员田同学!

今天上午收到一个需求,针对当前的系统开发一个对外开放的接口。

既然是对外开放,那么调用者一定没有我们系统的Token,就需要对调用者进行签名验证,签名验证采用主流的验证方式,采用Signature 的方式。

一、要求

下图为具体要求

二、流程

​1、线下分配appid和appsecret,针对不同的调用方分配不同的appid和appsecret

  2、加入timestamp(时间戳),10分钟内数据有效

  3、加入流水号noncestr(防止重复提交),至少为10位。针对查询接口,流水号只用于日志落地,便于后期日志核查。 针对办理类接口需校验流水号在有效期内的唯一性,以避免重复请求。

  4、加入signature,所有数据的签名信息。

三、实现

简单来说,调用者调用接口业务参数在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接口签名(Signature)实现方案 的文章就介绍到这了,更多相关Java接口签名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java awt实现计算器功能

    java awt实现计算器功能

    这篇文章主要为大家详细介绍了java awt实现计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 详解Java拦截器以及自定义注解的使用

    详解Java拦截器以及自定义注解的使用

    这篇文章主要为大家介绍了Java拦截器以及自定义注解的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助<BR>
    2021-12-12
  • SpringBoot初始教程之Servlet、Filter、Listener配置详解

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

    本篇文章主要介绍了SpringBoot初始教程之Servlet、Filter、Listener配置详解,具有一定的参考价值,有兴趣的可以了解一下
    2017-09-09
  • java使用xstream实现xml文件和对象之间的相互转换

    java使用xstream实现xml文件和对象之间的相互转换

    xml是一个用途比较广泛的文件类型,在java里也自带解析xml的包,但是本文使用的是xstream来实现xml和对象之间的相互转换,xstream是一个第三方开源框架,使用起来比较方便,对java xml和对象转换相关知识感兴趣的朋友一起看看吧
    2023-09-09
  • 5个JAVA入门必看的经典实例

    5个JAVA入门必看的经典实例

    这篇文章主要为大家详细介绍了5个JAVA入门必看的经典实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • 浅谈导入JavaWeb 项目出现的问题

    浅谈导入JavaWeb 项目出现的问题

    这篇文章主要介绍了导入JavaWeb 项目出现的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Java开发岗位面试被问到反射怎么办

    Java开发岗位面试被问到反射怎么办

    这篇文章主要介绍了java 面向对象面试集锦的相关资料,这里整理了面向对象的基础知识,帮助大家学习理解此部分的知识,需要的朋友可以参考下
    2021-07-07
  • Spring将MultipartFile转存到本地磁盘的三种方式

    Spring将MultipartFile转存到本地磁盘的三种方式

    在Java中处理文件向来是一种不是很方便的操作,然后随着Spring框架的崛起,使用Spring框架中的MultipartFile来处理文件也是件很方便的事了,今天就给大家介绍Spring将MultipartFile转存到本地磁盘的方式,需要的朋友可以参考下
    2024-10-10
  • java实现自定义表格渲染和编辑

    java实现自定义表格渲染和编辑

    这篇文章主要为大家详细介绍了java如何实现自定义表格渲染和编辑,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • Java中的异步回调问题

    Java中的异步回调问题

    这篇文章主要介绍了Java中的异步回调问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12

最新评论