如何在Spring Boot rest服务方法中设置响应头值?

如何在Spring Boot rest服务方法中设置响应头值?,spring,spring-boot,Spring,Spring Boot,新手问题。。。我正在构建我的第一个Spring Boot restful服务。我的restful服务设计要求在响应头中返回一些数据 如何在控制器类方法中设置响应头值?来自Spring文档: @RequestMapping("/handle") public ResponseEntity<String> handle() { URI location = ...; HttpHeaders responseHeaders = new HttpHeaders();

新手问题。。。我正在构建我的第一个Spring Boot restful服务。我的restful服务设计要求在响应头中返回一些数据


如何在控制器类方法中设置响应头值?

来自Spring文档:

@RequestMapping("/handle")
public ResponseEntity<String> handle() {
    URI location = ...;
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.setLocation(location);
    responseHeaders.set("MyResponseHeader", "MyValue");
    return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
}
@RequestMapping(“/handle”)
公共响应句柄(){
URI位置=。。。;
HttpHeaders responseHeaders=新的HttpHeaders();
负责人。设置位置(位置);
responseHeaders.set(“MyResponseHeader”、“MyValue”);
返回新的ResponseEntity(“Hello World”,responseHeaders,HttpStatus.CREATED);
}

来源:

与其他答案不同,不要使用
HttpServletResponse
。如果可以避免的话,您不想使用低级Servlet API。返回或
HttpEntity

HttpHeaders headers = new HttpHeaders();
headers.add("1", "uno");

return new ResponseEntity<>(headers, HttpStatus.OK);
HttpHeaders=newhttpheaders();
标题。添加(“1”、“uno”);
返回新的响应属性(标题,HttpStatus.OK);

我在寻找答案,我不想创建响应实体。我在春季论坛上找到了解决方案,这要归功于作者

简而言之,您可以在方法声明中请求响应,这样就可以填充响应

一个简单的例子:

@RequestMapping(value="/car/{carId}", method = RequestMethod.Get)
@ResponseBody
public Car getCarById(@PathVariable("carId") String Id, HttpServletResponse response) {

    response.setHeader("X-Special-Header", myCar.getEcoLabel());
    //get the car
    return myCar;
}
希望这对其他人也有帮助


要设置响应标题,有多种方法:

  • 正如@Matias Elorriaga所提到的,您可以使用它向单个响应添加标题
  • ,要将标题添加到所有响应,还可以添加java筛选器
  • 或,在Spring 5中,您还可以使用WebFilter向所有响应添加标题

  • 无法理解此方法应在何处出现。我按照此页面创建服务,需要让响应消息包含标题“Access Control Allow Origin”。不要返回“Greeting”对象,而是返回一个ResponseEntity,以Greeting对象为主体,还可以将标题添加到响应实体。看看可用的构造函数,我同意你的观点,使用低级servlet API会给我带来一些问题,你的解决方案非常棒。谢谢。我最近升级到了Spring boot 1.4.7,现在这个方法没有传递一些设置的头(以前是有效的)。它被认为是不受欢迎的还是1.4.7中有一个bug?@nafas我建议用更多的信息来回答一个新问题,而不是“不起作用”。这个答案在写出来的时候解决了原来的问题;它不能保证在接下来的100年里继续工作。
    
    import java.io.IOException;
    
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Component;
    
    @javax.servlet.annotation.WebFilter(urlPatterns = {"/*"})
    @Component
    public class ResponseHeaderFilter implements javax.servlet.Filter {
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            HttpServletResponse res = (HttpServletResponse) response;
            res.setHeader("My-Custom-Header", "Header-Value-Here");
            chain.doFilter(request, response);
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
        @Override
        public void destroy() {
        }
    }
    
    
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import org.springframework.web.server.WebFilter;
    import org.springframework.web.server.WebFilterChain;
    
    @Component
    public class ResponseHeaderWebFilter implements WebFilter {
    
        @Override
        public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {
            exchange.getResponse().getHeaders().add("My-Custom-Header", "My-Value-Here");
            return chain.filter(exchange);
        }
    }