【问题标题】:How to set content-length in Spring MVC REST for JSON?如何在 Spring MVC REST 中为 JSON 设置内容长度?
【发布时间】:2014-08-01 03:08:27
【问题描述】:

我有一些代码:

@RequestMapping(value = "/products/get", method = RequestMethod.GET)
public @ResponseBody List<Product> getProducts(@RequestParam(required = true, value = "category_id") Long categoryId) {
    // some code here
    return new ArrayList<>();
}

如何配置 Spring MVC(或 MappingJackson2HttpMessageConverter.class)以默认设置正确的标头 Content-Length?因为现在我的响应标头content-length 等于-1。

【问题讨论】:

标签: java json spring spring-mvc content-length


【解决方案1】:

链中的以下过滤器设置内容长度:

import javax.servlet.Filter;
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.web.util.ContentCachingResponseWrapper;

public class MyFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,     FilterChain chain) throws IOException, ServletException {

        ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper((HttpServletResponse) response);

        chain.doFilter(request, responseWrapper);

        responseWrapper.copyBodyToResponse();

    }

    @Override
    public void destroy() {
    }

}

主要思想是将所有内容缓存在 ContentCachingResponseWrapper 中,最后在调用 copyBodyToResponse() 时设置 content-length。

【讨论】:

    【解决方案2】:

    您可以将 ShallowEtagHeaderFilter 添加到过滤器链中。以下 sn-p 对我有用。

    import java.util.Arrays;
    
    import org.springframework.boot.context.embedded.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.filter.ShallowEtagHeaderFilter;
    
    @Configuration
    public class FilterConfig {
    
        @Bean
        public FilterRegistrationBean filterRegistrationBean() {
            FilterRegistrationBean filterBean = new FilterRegistrationBean();
            filterBean.setFilter(new ShallowEtagHeaderFilter());
            filterBean.setUrlPatterns(Arrays.asList("*"));
            return filterBean;
        }
    
    }
    

    响应正文如下所示:

    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    X-Application-Context: application:sxp:8090
    ETag: "05e7d49208ba5db71c04d5c926f91f382"
    Content-Type: application/json;charset=UTF-8
    Content-Length: 232
    Date: Wed, 16 Dec 2015 06:53:09 GMT
    

    【讨论】:

    • org.springframework.boot.context.embedded.FilterRegistrationBean 从 1.4 开始被弃用,取而代之的是 org.springframework.boot.web.servlet.FilterRegistrationBean
    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2015-06-11
    • 2012-05-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多