【问题标题】:How to set response header in spring mvc如何在spring mvc中设置响应头
【发布时间】:2013-09-03 06:37:26
【问题描述】:

我有一个方法,我想在其中设置响应头缓存控制和编译指示:-

public String addUser(@Valid User user, BindingResult bindingResult)
{
    if(bindingResult.hasErrors())
    {
        bindingResult.getFieldError();
        return"edit";
    }
    return "redirect:/welcome/profile/"+user.getName();
}

在这种方法中,我想设置缓存控制和编译指示,就像我们在简单的 servlet 代码中使用 HttpservletResponse 调用 setHeader 方法一样:-

response.setHeader("Cache-Control","no-cache,no-store,must-revalidate");
    response.setHeader("Pragma","no-cache");
    response.setDateHeader("Expires", 0);

我搜索了 spring 文档,找不到任何直接的方法,但我发现了这个:-

@RequestMapping("/something")
public ResponseEntity<String> handle(HttpEntity<byte[]> requestEntity) throws UnsupportedEncodingException 
{
    String requestHeader = requestEntity.getHeaders().getFirst("MyRequestHeader"));
    byte[] requestBody = requestEntity.getBody();
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.set("MyResponseHeader", "MyValue");
    return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
}

但是我不知道怎么用

【问题讨论】:

  • 但是我不知道怎么用 看来你用的很好。

标签: java spring spring-mvc


【解决方案1】:

如果您想为控制器的每个响应设置标头,您可以使用 @ModelAttribute 注释。

@ModelAttribute
public void setVaryResponseHeader(HttpServletResponse response) {
    response.setHeader("Vary", "Accept");
}    

【讨论】:

    【解决方案2】:
      public String addUser(@Valid User user, BindingResult bindingResult,HttpServletRequest request,HttpServletResponse response)
      {
           if(bindingResult.hasErrors())
           {
                bindingResult.getFieldError();
                return"edit";
          }
          response.setHeader("Cache-Control","no-cache,no-store,must-revalidate");
          response.setHeader("Pragma","no-cache");
          response.setDateHeader("Expires", 0);
          return "redirect:/welcome/profile/"+user.getName();
      }
    

    【讨论】:

      【解决方案3】:

      自 Spring v. 4.1 起:

      @RequestMapping("/something")
      public ResponseEntity<MyClass> handle()
      {
      return ResponseEntity.status(HttpStatus.CREATED)
                    .header("header", "value")
                    .body(new MyClass());
      }
      

      【讨论】:

      • 我怎样才能设置n从数组或列表中说的标题数量?
      • 您可以使用 ResponseEntity.headers( HttpHeaders ).body( ... )。 HttpHeaders 类实现了一个 MultiValueMap 接口,并具有方法 addAll(MultiValueMap values)addAll(K key, List extends V> values)
      【解决方案4】:

      您可以手动设置标题如下。

      进口:

      import org.springframework.http.HttpHeaders;
      

      代码:

      public ResponseEntity<Map<String, Object>> doSomething() {
         ...
      HttpHeaders respHeaders = new HttpHeaders();
      respHeaders.add("Pragma", "no-cache");
      respHeaders.add("Cache-Control","no-cache,no-store,must-revalidate");
      return new ResponseEntity<Map<String, Object>>(respHeaders, HttpStatus.OK);
      }
      

      【讨论】:

        猜你喜欢
        • 2018-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多