java - 如何在 Spring Boot 中处理 RequestParam 中的花括号

标签 java spring spring-boot url character-encoding

我有一个带有 GET 服务的 Spring Boot 应用程序。

@RequestMapping(value = "/abc/track/{type}", method = RequestMethod.GET)

    public void DummFunc(                            
          @RequestParam(value="subs", required = false) String sub,
,  HttpServletResponse response) {}
subs 的值是一个编码值。

如果我将以下作为值传递给参数 subs
{%22endpoint%22:%22https://def.abc.com/tyu/send/eD3vpGNQW28:APA91bHOo8rYrV0xccdQz3okjZJG-QGrJX8LG6ahJnEUpMNfGedqi3hJxQsJx_8BMbH6oDjaSPPEXqzNWchWrGSkhuTkSdemikkys1U22Ipd7MsRw0owWbw89V2fslIVAJ6G5lkyvYuQ%22,%22expirationTime%22:null,%22keys%22:{%22p256dh%22:%22BK0pktn50CMsTQtqwdPlKlJtdFs0LFeXX14T1zgoz6QWnvSTp5dxtChnUP5P1JX0TsjcopbdPKyN31HfABMUyic%22,%22auth%22:%22qbO_z0vGao9wD-E5g8VU-A%22}}

它无法捕获请求并且控制不在函数内部。

如果我们改为将值传递给参数 subs:
%7B%22endpoint%22:%22https://def.abc.com/tyu/send/dX5q5eV7hFQ:APA91bHib-0QXrMzjatcvTR_uaIeeJK8lf6GmXUC9Jxv0Oxth-BzD4GmWnd4-YpDZv8qSFZ0eSg9mB2YkRvkc5ezdXW5KeaHjuQZfdyDxyBXjJgE-25Xbtlk37pdm8vfLk20k0k_VxW9%22,%22expirationTime%22:null,%22keys%22:%7B%22p256dh%22:%22BCCvcBLpRqp4u0auP688_MUJLsAiwWlQSn5kpyl8YVsEo_J-KpSdnhCmVIE_BhDXBcFYflPK52hqhYf3EaOCyuY%22,%22auth%22:%22iKuW_ESkCZnubWcQu_JK8w%22%7D%7D

它工作正常。
  • 为什么会这样?第一次编码有什么问题?
  • 由于服务器无法处理请求,它返回 400。我需要捕获此类请求,然后通过正确编码来处理它们。什么是前进的道路?

  • 我是 Spring Boot/Spring 和 Java 本身的新手。如果我能获得一些洞察力,那就太好了。

    另外,我可以在这里在线解码它们,没有任何问题- https://www.urldecoder.org/

    编辑:基本上,有问题通过的请求有 {}而不是 %7B%7D .

    我的问题不是应用程序因 400 个错误请求而失败,而是如何在我的应用程序中捕获此类请求,正确编码它们然后处理它们。

    最佳答案

    这与 Java 或 Spring 本身无关,而是与 HTML URL 编码引用相关。 URL 只能使用 ASCII 字符集通过 Internet 发送。

    不安全字符定义在 RFC-1738 的开头这是 list :

    " < > # % { } | \ ^ ~ [ ] ` including the blank/empty space.



    除此之外,还有属于以下的保留字符,用于区分参数、键值表示、端口等。

    ; / ? : @ = &



    您使用的不安全字符是 {}等于 %7B%7D .

    基本上,您应该 不是 关注客户以您描述的方式发送给您的数据。服务器必须要求传递正确的表单和 URL。尽管浏览器和 REST 客户端会自动对这些字符进行编码,但以编程方式发送它们可能会导致错误。我所知道的 Spring 中仅有的两个可用解决方案是通过注册 CharacterEncodingFilter bean(已经 answered)或 Spring-Boot 配置:
    spring.http.encoding.charset=UTF-8
    spring.http.encoding.enabled=true
    spring.http.encoding.force=true
    

    您需要先启用编码并强制执行 HTTP 请求和响应。

    关于java - 如何在 Spring Boot 中处理 RequestParam 中的花括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54005532/

    相关文章:

    java - 为什么 sonar-maven-plugin 在加载全局设置或 Activity 规则时挂起?

    java - Gradle 依赖排除不适用于传递依赖

    java - 是否有任何基于 Spring-Security 的 Java 生产就绪安全包?

    java - 如何将一系列 application.properties 反序列化为 Java 中的 Map

    java - Eclipse 中 Spring Boot 所需的服务器

    java - Spring Boot 中的 SSL 证书

    java - 如何在 Java 中正确实现 LZ4、Snappy 或等效的压缩技术?

    Java - 调用线程 : how does it route to Runnable interface's run ()? 上的启动方法

    java - appengine spring aop java.security.AccessControlException : access denied ("java.lang.RuntimePermission" "accessClassInPackage.sun.reflect")

    java - Hibernate、JDBC、Mysql、无法登录数据库