【问题标题】:Spring MVC Override Received Content TypeSpring MVC 覆盖接收到的内容类型
【发布时间】:2017-07-21 05:48:16
【问题描述】:

我正在开发一个 Spring MVC 应用程序并且有一个我无法控制的客户端。此客户端正在 POST JSON 数据但传输 application/x-www-form-urlencoded 标头。 Spring 自然信任此标头并尝试接收数据但不能因为它的 JSON。有没有人有过覆盖 Spring 接收到的标头,或者只是明确指定即将到来的数据类型,而不管标头如何?

【问题讨论】:

    标签: java json spring spring-mvc


    【解决方案1】:

    你可以做两件事;

    1. 更改客户端发送Content-Type: application/json标头
    2. 编写一个位于 Spring Controller 之上的 Servlet 过滤器或 Spring Interceptor 并检查标头 Content-Type。如果不是application/json,则将其更改为application/json

    【讨论】:

    • 3.通过添加 HttpServletRequestReaderInputStream@RequestBody String 或 ... 类型的参数手动读取有效负载
    • 谢谢!我最终选择了@RequestBody String 路线,因为它最适合我的用例!
    • 我已经尝试过建议 2。但是 HttpServletRequest 在涉及到标头时是不可变的,我试图将它包装在我的一个中并覆盖标头,但仍然如此。关于如何做 2 的任何示例?
    • 你还需要重写 HttpServletRequest 和很多东西。
    【解决方案2】:

    为什么不编写一个单独的控制器来处理application/x-www-form-urlencoded 请求。如果请求是有效的 JSON,那么您可以对其进行解析并将其转发给适当的服务。

    通过这种方式,您还可以在将来处理您收到相同类型的请求但不是有效 JSON 的情况。

    @RequestMapping(value = "/handleURLEncoded", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public @ResponseBody Object handleURLEncoded(HttpEntity<String> httpEntity) {
        String json = httpEntity.getBody();
        //now you have your request as a String
        //you can manipulate it in any way
    
        if(isJSONValid(json)) {
            JSONObject jsonObj = new JSONObject(json);
            //forward request or call service directly from here
            //...
        }
    
        //other cases where it's not a valid JSON
    }
    

    注意:isJSONValid() 方法复制自 this 答案

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-21
      • 2021-12-09
      • 2021-10-05
      • 1970-01-01
      • 2018-08-05
      • 2014-10-21
      • 1970-01-01
      • 2021-08-25
      相关资源
      最近更新 更多