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

use*_*835 13 spring spring-boot

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

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

Mat*_*aga 14

我建议你在问这里之前搜索文档:

@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);
}
Run Code Online (Sandbox Code Playgroud)

资料来源:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/ResponseEntity.html


Abh*_*kar 12

与其他答案不同,请勿使用HttpServletResponse.如果可以避免,那么您不想使用低级Servlet API.返回ResponseEntityHttpEntity.

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

return new ResponseEntity<>(headers, HttpStatus.OK);
Run Code Online (Sandbox Code Playgroud)

  • @nafas我建议用一个比“不起作用”更多的信息来打开一个新问题。这个答案解决了最初的问题。它不能保证在未来100年内都能正常工作。 (2认同)

sin*_*eep 8

设置响应头有多种方法:

  1. 正如 @Matias Elorriaga 所提到的,您可以使用它来将标头添加到单个响应中。
  2. 或者,要向所有响应添加标头,您还可以添加 java 过滤器。

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() {
    }
}

  1. 或者,在 Spring 5 中,您还可以让 WebFilter 为所有响应添加标头。

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);
    }
}


Luc*_* S. 7

我一直在寻找答案,而且我不想创建响应实体。我在春季论坛上找到了解决方案,因此请记下作者的功劳。

简而言之,您可以在方法声明中请求响应,因此可以填充它。

一个简单的例子:

@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;
}
Run Code Online (Sandbox Code Playgroud)

希望这对其他人也有帮助。

http://forum.spring.io/forum/spring-projects/web-services/102652-setting-header-values-with-spring-rest-controller