使用spring从请求参数中提取原始十六进制字符串

时间:2020-11-03 20:41:00

标签: java spring spring-boot spring-mvc tomcat

我正在创建一个端点,该端点有望接收一个十六进制字符串(sha1)作为获取参数,以使用给定的哈希值检索特定文件,但是我似乎无法弄清楚出了什么问题无法将原始的十六进制字符串转换为字符串。

从wireshark中,请求看起来像这样GET /retrieveFile?hash=%9f%e7%e9m%8dx%ad%8cNY-tl%c6%00%1e%f5%cb%7c%ee HTTP/1.1,期望的SHA1是9fe7e96d8d78ad8c4e592d746cc6001ef5cb7cee

我的控制器中的代码段

@RequestMapping()
public byte[] retrieveFile(
        @RequestParam(value = "hash") @Size(min = 20, max = 20) String hash
        HttpServletRequest request
) {

当读取原始字符串时,它通常充满不可打印的字符。运行hash.getBytes()时,我得到以下大小为40的字节数组:

-17 -65 -67 -17 -65 -67 -17 -65 -67 109 -17 -65 -67 120 -17 -65 -67 -17 -65 -67 78 89 45 116 108 -17 -65 -67 0 30 -17 -65 -67 -17 -65 -67 124 -17 -65 -67

但是我希望这个字节数组为20:

-97 -25 -23 109 -115 120 -83 -116 78 89 45 116 108 -58 0 30 -11 -53 124 -18 -18

我确实看到“ -17”的模式,它大致与%符号匹配,但与我通常解码UTF-8字符串的方式不匹配。

要调试此问题,我现在到达了从start.spring.io创建最基本的项目的地方,仅使用此控制器和一个断点。我的假设是,我发现从请求中解码字符串的方式存在问题,但我无法指出如何解决该问题。

Ps。我无法控制如何将数据发送到我的服务。我真的希望有人能在这里发现我的错。

感谢您抽出宝贵的时间来研究这个问题。

更新:我已经确认,如果我使用原始值,例如DatatypeConverter.printHexBinary(URLCodec.decodeUrl("%9f%e7%e9m%8dx%ad%8cNY-tl%c6%00%1e%f5%cb%7c%ee".getBytes()));

,则可以提取正确的哈希值

有了这个,我越来越倾向于认为这更多地是关于嵌入式Tomcat如何处理数据的。

0 个答案:

没有答案