Spring 可以帮助防止在浏览器上缓存 html 页面吗?

Can Spring help to prevent caching of html pages on the browser?

我有一个使用 ExtJS 的 Java/Spring 3.x 网络应用程序,我使用 Sencha Architect 创建前端,从而自动生成 app.html 在 JS 中加载的文件和 CSS 资源,如下所示:

<!DOCTYPE html>

<!-- Auto Generated with Sencha Architect -->
<!-- Modifications to this file will be overwritten. -->
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>ui</title>
    <script src="ext/ext-all.js"></script>
    <script src="ext/ext-theme-neptune.js"></script>
    <link rel="stylesheet" href="ext/resources/ext-theme-neptune/ext-theme-neptune-all.css">
    <link rel="stylesheet" href="css/custom.css">
    <script type="text/javascript" src="app.js"></script>
</head>
<body></body>
</html>

我想用 Spring 安全保护此 html 文件,这似乎有效,只是它经常缓存在浏览器中,因此即使用户未登录,它也会重新加载in. 这是我的 Spring XML 为我的 webapp 配置安全性:

<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd">

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/ui/app.html" access="hasRole('ROLE_USER')" />
    <intercept-url pattern="/ui/**" access="permitAll" />

    <form-login
        login-page="/login"
        default-target-url="/ui/app.html"
        authentication-failure-url="/login?error"
        username-parameter="username"
        password-parameter="password" />
    <logout logout-success-url="/login?logout" />
    <csrf/>  <!-- enable csrf protection -->
</http>

<authentication-manager>
    <authentication-provider >
        <user-service>
            <user name="test" password="test" authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>

</beans:beans>

如您所见,我已将其配置为保护 ui/app.html 资源,并在登录后重定向到该页面。这工作正常,直到浏览器缓存页面并在用户注销并尝试访问相同的页面时引起混淆 URL.

我想知道 Spring MVC 是否可用于通过控制器加载页面,也许修改 HTTP headers 以强制页面过期,但由于这是一个页面通常由 servlet 容器而不是 MVC 直接交付我不确定我将如何配置它。

我还希望能够离开我的 app.html 文件 in-situ,因为它使用与其相关的资源,而且它也是使用 Sencha Architect 时更容易将其留在那里。

这将阻止浏览器缓存:

<http>
    <!-- ... -->
    <headers>
        <cache-control />
    </headers>
</http>

它为每个响应添加 Cache-ControlPragmaExpires headers。可以在参考文档的 Security HTTP Response Headers.

部分中找到更多信息

更新: 此答案是为 Spring 安全性的 3.2 版编写的。从版本 4 开始,这些 headers 默认包含。

您可以选择以下选项之一,具体取决于您的应用程序将如何为资源请求提供服务。

  1. 使用 Spring 安全 http://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html#headers-cache-control

  2. 使用 Extjs http://www.sencha.com/forum/showthread.php?257086-Is-there-a-simple-way-to-disable-caching-for-an-entire-ExtJS-4-application

  3. 使用HTML http://www.htmlgoodies.com/beyond/reference/article.php/3472881