如何在Response Body上添加其他标头

时间:2013-11-14 05:24:23

标签: json spring spring-mvc

只需查看SpringMVC-3.2.x控制器操作方法的代码段即可。生成JSON非常容易,但无法为特定控制器的此操作/特定操作方法添加addtional自定义标头。并非适用于所有JSON @ResponseBody操作方法。

@RequestMapping(value="ajaxDenied", method = RequestMethod.GET)
public @ResponseBody Map<String, Object> ajaxDenied(ModelMap model) {

    Map<String, Object> message = new HashMap<String, Object>();
    message.put("severity", "error");
    message.put("summary", "Restricted access only");
    message.put("code", 200);

    Map<String, Object> json = new HashMap<String, Object>();
    json.put("success", false);
    json.put("message", message);

    return json;
}

以不同的方式,我可以添加额外的标头作为我的需求,但这是生成纯JSON的一些问题。它生成了错误JSON并且能够解析几个浏览器。

@RequestMapping(value="ajaxSuccess", method = RequestMethod.GET)
public ResponseEntity<String> ajaxSuccess(){
    Map<String, Object> message = new HashMap<String, Object>();

    message.put("severity", "info");
    message.put("location", "/");
    message.put("summary", "Authenticated successfully.");
    message.put("code", 200);

    Map<String, Object> json = new HashMap<String, Object>();
    json.put("success", true);
    json.put("message", message);

    String data = "";
    try {
        ObjectMapper mapper = new ObjectMapper();
        data  = mapper.writeValueAsString(json);
    } catch (Exception e) { //TODO
    }
    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json; charset=UTF-8");
    headers.add("X-Fsl-Location", "/");
    headers.add("X-Fsl-Response-Code", "302");
    return (new ResponseEntity<String>(data, headers, HttpStatus.OK));
}

这个动作方法可以生成带有转义字符而不是纯JSON的{​​{1}}字符串,因此依赖于浏览器将如何解析它,导致chrome失败。输出看起来像

JSON

但是我们想要的输出

"{\"message\":{\"summary\":\"Authenticated successfully.\",\"location\":\"/\",\"severity\":\"info\",\"code\":\"200\"},\"success\":true}"

我想根据特定控制器的特定操作条件生成带有额外标头的纯{ "message":{ "summary": "Authenticated successfully.", "location":"/", "severity":"info", "code":"200" }, "success":true }

3 个答案:

答案 0 :(得分:27)

您可以向ResponseEntity构建器添加标头。我认为这样更干净。

import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;

// ...

@GetMapping("/my/endpoint")
public ResponseEntity myEndpointMethod() {

    HttpHeaders headers = new HttpHeaders();
    headers.add(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8");

    return ResponseEntity.ok()
            .headers(headers)
            .body(data);
}

答案 1 :(得分:16)

这是解决方案,作为 M的建议。 Deinum

@RequestMapping(value="ajaxSuccess", method = RequestMethod.GET)
public ResponseEntity<Map<String, Object>> ajaxSuccess(){
    Map<String, Object> message = new HashMap<String, Object>();

    message.put("severity", "info");
    message.put("location", "/");
    message.put("summary", "Authenticated successfully.");
    message.put("code", 200);

    Map<String, Object> json = new HashMap<String, Object>();
    json.put("success", true);
    json.put("message", message);

    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json; charset=UTF-8");
    headers.add("X-Fsl-Location", "/");
    headers.add("X-Fsl-Response-Code", "302");
    return (new ResponseEntity<Map<String, Object>>(json, headers, HttpStatus.OK));
}

答案 2 :(得分:6)

您还可以使用HttpServletResponse以更简单的方式添加状态和标题:

@RequestMapping(value="ajaxSuccess", method = RequestMethod.GET)
@ResponseBody
public String ajaxSuccess(HttpServletResponse response) {
  response.addHeader("header-name", "value");
  response.setStatus(200);
  return "Body";
}

因此,您需要添加以下maven依赖提供

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-servlet-api</artifactId>
    <version>7.0.53</version>
    <scope>provided</scope>
</dependency>