一、前言
最近在做接口对接,涉及到了加密解密,签名验签等操作。关于这块的技术,在之后的博客中在详谈。大概说一下事情的经过。客户端先把传输的数据进行签名,然后再进行加密,总之就是变成个大字符串传给服务端,服务端进行解密,然后再进行验签。通过之后进行业务处理。把处理结果经过签名和加密操作再传送给客户端。
问题表现为在服务端把串返给客户端,客户端解密居然失败啦!!!我勒个擦,什么鬼?按理说不应该啊,服务端能成功把客户端传送过来的数据进行解密,反之则不行?!
后来经过探索才发现问题所在。是因为我们的xxController类加了@RestController注解。众所周知,@RestController注解相当于@Controller注解+@ResponseBody。而@ResponseBody注解的作用是将对象转换成json串。
字符串转json的结果如下:
String message="Hello";
System.out.println("最原始值:"+message);
String s2json = JSONUtil.beanToJson(message);
System.out.println("json化字符串:"+s2json);
String s2 = JSONUtil.jsonToBean(s2json, String.class);
System.out.println("去json化:"+s2);
输出结果如下:
由输出结果可知字符串json化会把Hello变成“Hello”拿“Hello”去解密自然会失败啦。
二、解决思路
既然发现了问题所在。那索性直接把@RestController注解换成@Controller注解。换了之后,服务不能正常启动。后来仔细想了想,即使服务能正常启动。该服务还要保证其他服务能够通过feignclient来进行调用。很显然这种思路行不通。
之后再经理的建议下,查看之前旧系统代码。更加蒙圈了。具体代码类似下面