【问题标题】:How to set content-length after a view is resolved using spring mvc?使用spring mvc解决视图后如何设置内容长度?
【发布时间】:2011-11-20 08:20:18
【问题描述】:

我们正在为我们正在构建的 API 使用 Spring MVC (3.0.5)。但是,我们发现应用程序并不总是在响应标头中返回内容长度。为什么我还没有弄清楚。我们无法在控制器中手动设置内容长度 (request.setContentLength(x)),因为我们只使用在 Freemarker 视图中通过控制器获得的数据的子集。所以基本上我们需要的是计算和设置内容长度一个视图已经被解析/编译并且就在它实际上被发送到客户端之前。

有没有常见的(“良好实践”)方法来做到这一点?甚至是“丑陋”的方式?

【问题讨论】:

    标签: spring http spring-mvc http-headers freemarker


    【解决方案1】:

    通过实现HandlerInterceptor 接口来拦截您的请求。 afterCompletion 方法在视图解析后运行,因此您应该可以在那里设置值,因为该方法的签名通过了HttpServletResponse。这样配置:

    <!-- Configures Handler Interceptors -->    
    <mvc:interceptors>
        <bean class="com.myapp.web.interceptor.MyInterceptor" />
    </mvc:interceptors>
    

    这是一些基本代码:

    @Component
    public class MyInterceptor implements HandlerInterceptor {
    }
    

    【讨论】:

    • 酷!此时它是否可以访问已解析的视图?为了让我计算内容长度
    • 我相信是这样,因为 afterCompletion 方法在所有处理程序和视图处理完成后运行。请参阅stackoverflow.com/questions/5435351/…,David 的回答,了解如何获取响应的大小。
    • 其实这样是行不通的,因为拦截器方法postHandle会在视图解析发送前运行,而afterCompletion会在视图解析发送后运行。使用此解决方案之间没有任何区别
    猜你喜欢
    • 2014-08-01
    • 2011-11-10
    • 2016-07-12
    • 2015-01-06
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2012-05-01
    • 2018-01-22
    相关资源
    最近更新 更多