简体   繁体   English

如何从ServletResponse获取内容类型?

[英]How to get the content type from a ServletResponse?

I'm implementing a filter, which overrides the doFilter method, to insert in the response header some "cache-control" values. 我正在实现一个覆盖doFilter方法的过滤器,以便在响应标头中插入一些“缓存控制”值。 The thing is that I only want that values to be set in the responses with a JSON content type. 事实是,我只希望在响应中使用JSON内容类型设置值。 I tried to call response.getContentType before set the new header values but it always evaluates to null. 在设置新的标头值之前,我尝试调用response.getContentType ,但它始终计算为null。

 @Override
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,
                     final FilterChain filterChain) throws IOException, ServletException {

    try {

        final HttpServletResponse response = (HttpServletResponse) servletResponse;

        if(response != null) {

            final HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(response);

            if(wrapper.containsHeader(HttpHeaders.CONTENT_TYPE)
                    && wrapper.getHeader(HttpHeaders.CONTENT_TYPE).equals("application/json")) {

                response.setHeader("Expires", "Mon, 23 Aug 1982 12:00:00 GMT");
                response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
            }
        }

    filterChain.doFilter(servletRequest, servletResponse);
    }

    catch(final Exception e) {
        LOG.error(e.getLocalizedMessage());
    }
}

The difficulty with servlet filters is that they are too coarse-grained for that kind of functionality. Servlet过滤器的困难在于,对于这种功能而言,它们的粒度太粗。 The doFilter method is "all-or-nothing", that is there is nothing set in the response before it is called and the entire response is already committed after it returns so it's too late then to add any header. doFilter方法是“ all-or-nothing”,即在调用之前没有在响应中设置任何内容并且返回整个响应都已提交因此添加任何标头为时已晚。

What you can do instead is to wrap the response and intercept the setHeader method in the wrapper, then pass that to doFilter . 相反,您可以做的是包装响应并在包装器中拦截setHeader方法,然后将其传递给doFilter There is a helper class HttpServletResponseWrapper designed for that purpose. 为此目的设计了一个辅助类HttpServletResponseWrapper

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从 Spring Boot 过滤器中的 servletResponse 获取响应正文 - How to get Response Body from servletResponse in Spring Boot Filter 我如何从ServletResponse()。getHeader(string)不可见的响应中获取标头? - How i can i get header from response as ServletResponse().getHeader(string) is not visible? 如何在不使用ServletFilter的情况下从ServletResponse获取HTTP状态代码? - How can I get the HTTP status code from ServletResponse without using a ServletFilter? 如何从ServletFilter中的ServletResponse中获取HTTP状态代码? - How can I get the HTTP status code out of a ServletResponse in a ServletFilter? 检查ServletResponse是否包含任何内容 - Check if ServletResponse has any content 如何从内容类型获取文件扩展名? - How to get file extension from content type? 如何通过blobkey从blobstore获取内容类型? - How to get content type from blobstore by blobkey? 如何将JSP InputStream合并到ServletResponse中? - How to tanslate a JSP InputStream into a ServletResponse? 优化将StringBuilder的内容写入ServletResponse - Optimising writing StringBuilder's content to ServletResponse 如何从地图中的内容对象获取属性类型 - how to get a property type from an content object in a map
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM