【问题标题】:Spring boot path param url encoding issueSpring引导路径参数url编码问题
【发布时间】:2020-09-20 02:23:56
【问题描述】:

我有一个弹簧启动应用程序,在我的一个控制器中,我有一个来自路径参数的字符串。我的控制器如下所示:

Controller.java

@GetMapping(value=“/id/{txt}/user”)
public ResponseEntity<MyUser> getUser(@PathVariable String txt) {

}

在我的请求中,我会将 txt 值作为带有一些 url 编码字符的字符串。以下是请求的示例:

/id/Siney6jginshbnsu%252Fghshs%253D

但是当我调试应用程序时,路径变量 txt 是:

/id/Siney6jginshbnsu%2Fghshs%3D

问题是我正在使用 .equals 对 txt 进行字符串比较,并且由于上述编码/解码问题,我看到了问题。

有什么方法可以完全按原样从请求中获取 url 编码的字符串?

我知道我可以尝试对添加 %25 的 txt 进行编码,但问题是我可能在字符串中有 % 会将其编码为 %25。如果有人可以提供帮助或建议解决此问题的方法,非常感谢。

提前致谢。

【问题讨论】:

    标签: java spring-boot urlencode path-variables


    【解决方案1】:
    @GetMapping("/id/{txt}/user")
    public ResponseEntity<MyUser> getUser(HttpServletRequest request, @PathVariable(name="txt") String txt) {
        String urlNotEncoded = request.getRequestURI();
        ...
    }
    

    这样 urlNotEncoded 包含:“/id/Siney6jginshbnsu%252Fghshs%253D/user”,此时您可以创建自己的函数来提取 txt。

    【讨论】:

    • 这看起来是个不错的选择。但是您认为采用这种方法是一种好习惯吗?由于 spring 具有相同的功能,我们真的应该在外部处理这个吗? spring 有没有像把完整的东西当作字符串一样抓取的东西?
    • 据我所知,因为 PathVariable 是从 URI 路径中提取值,所以它没有被编码。另一方面, RequestParam 被编码(但我认为你不能使用这种方法)。最好的办法可能是避免需要在 {txt} 部分编码的特殊字符。我假设是一个 ID,所以你应该改变你生成它的方式。
    【解决方案2】:

    你能试试这个代码吗:

    @GetMapping(value=“/id/{txt}/user”)
    public ResponseEntity<MyUser> getUser(@PathVariable("txt") String txt) {
    
    }
    

    【讨论】:

    • 其他代码..不知道你到底是什么意思..如果需要,我绝对可以尝试添加更多信息,但您能否澄清一下您希望我包含哪些其他代码?跨度>
    • 它是一个 Spring Boot 应用程序,带有问题中已经提到的控制器。问题是spring正在对pathparam进行url解码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2021-02-11
    • 2015-01-25
    • 2021-10-28
    • 2016-04-16
    • 2021-08-22
    相关资源
    最近更新 更多