弹簧响应实体

2022-09-03 18:21:20

我有一个用例,我需要将PDF返回给我们生成的用户。在这种情况下,我需要做的似乎是利用响应实体,但我有一些事情不是很清楚。

  1. 如何重定向用户 - 让我们假装他们没有访问此页面的权限?如何将它们重定向到单独的控制器?
  2. 我能够设置响应编码吗?
  3. 我是否可以在不将 HttpResponse 作为参数引入请求映射的情况下实现这两个中的任何一个?

我使用的是Spring 3.0.5。示例代码如下:

@Controller
@RequestMapping("/generate/data/pdf.xhtml")
public class PdfController {

    @RequestMapping
    public ResponseEntity<byte []> generatePdf(@RequestAttribute("key") Key itemKey) {
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.setContentType(MediaType.valueOf("application/pdf"));

        if (itemKey == null || !allowedToViewPdf(itemKey)) {
            //How can I redirect here?
        }

        //How can I set the response content type to UTF_8 -- I need this
        //for a separate controller
        return new ResponseEntity<byte []>(PdfGenerator.generateFromKey(itemKey),
                                           responseHeaders,
                                           HttpStatus.CREATED);
    }

我真的不想拉动响应...到目前为止,我的控制器都没有这样做,我讨厌不得不把它带进来。


答案 1

请注意,这在 Spring 3.1 中有效,不确定原始问题中询问的 Spring 3.0.5。

在要处理重定向的返回 ResponseEntity 语句中,只需向 ResponseEntity 添加“Location”标头,将正文设置为 null,然后将 HttpStatus 设置为 FOUND (302)。

HttpHeaders headers = new HttpHeaders();
headers.add("Location", "http://stackoverflow.com");

return new ResponseEntity<byte []>(null,headers,HttpStatus.FOUND);

这将使您不必更改控制器方法的返回类型。


答案 2

关于重定向,您需要做的就是将返回类型更改为Object:

@Controller
@RequestMapping("/generate/data/pdf.xhtml")
public class PdfController {

    @RequestMapping
    public Object generatePdf(@RequestAttribute("key") Key itemKey) {
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.setContentType(MediaType.valueOf("application/pdf"));

        if (itemKey == null || !allowedToViewPdf(itemKey)) {
            return "redirect:/some/path/to/redirect"
        }

        //How can I set the response content type to UTF_8 -- I need this
        //for a separate controller
        return new ResponseEntity<byte []>(PdfGenerator.generateFromKey(itemKey),
                                           responseHeaders,
                                           HttpStatus.CREATED);
    }

推荐