首页 文章

如何使用spring boot来抑制url编码

提问于
浏览
1

我使用Spring引导创建了一个GET / POST API,它有一个http url参数说refid . 现在,在调用GET / POST请求之前,该参数已被编码,例如http://localhost:8080/users/TESTFNkJXiQAH%2FJBKxigBx

但是,当我通过Spring Boot部署它时,编码的refid再次被编码并且refid会改变 . 即成为:

http://localhost:8080/users/TESTFNkJXiQAH%252FJBKxigBx

我想通过Spring启动来抑制第二个编码 . 有谁可以在这里提出建议?

3 回答

  • 1

    不知道你是否还有这个问题,或者你发现它为什么会发生,但是因为我试图向某人解释这个现象,我看是否已经有了一个很好的解释 . 但既然你也问过,我没有找到,这是我的答案 .

    所以你编码你的refid

    TESTFNkJXiQAH%2FJBKxigBx

    在通过网址发送之前,然后将其提供给浏览器 . 现在这只是编码的refid . 当您通过URL直接调用它时,您必须根据HTML URL编码标准再次对其进行编码 . 这就是为什么双重逃脱 . 另请阅读this . 例如 . 所以如果你的refid看起来像这样

    测试%123

    你编码它你把它变成了

    测试%25123

    现在,如果您还想通过浏览器上的URL传递它,则必须再次对其进行编码 .

    测试%2525123

    但是,如果服务A正在使用此服务并且服务A正确编码此refid,那么您将不会遇到此问题 . 这只是因为你试图通过浏览器调用这个api endpoints .

    当然,我理所当然地认为你这样做:

    String decoded = URLDecoder.decode(refid, "UTF-8");
    

    在你的控制器中

  • -1

    首先传递解码后的URL,而不是做一些不方便的事情来停止双重编码 . 您在休息控制器中已经解码了字段 . 例如,如果您通过www.xyz.com?name=nilesh%20salpe

    你会得到param name的值为“nilesh salpe”而不是“nilesh%20salpe”

  • 0

    这是URLDecoder的基本示例:

    @RequestMapping(value = "/users/{refId}", method = GET)
       public void yourMethod(@PathVariable("refId") String refId) {
          // This is what you get in Spring Boot
          String encoded = refId; //"TESTFNkJXiQAH%252FJBKxigBx"
    
          String decoded = URLDecoder.decode(encoded, "UTF-8");
    
          System.out.println(decoded);
    
          // Result TESTFNkJXiQAH%2FJBKxigBx
       }
    

相关问题