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

时间:2015-03-17 07:18:07

标签: spring spring-mvc spring-security cache-control sencha-architect

我有一个使用ExtJS的Java / Spring 3.x webapp,我使用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文件,这似乎有效,除了它经常在浏览器中缓存,以便即使用户没有登录也会重新加载。这是我的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标头以强制页面过期,但因为这是一个通常由servlet容器而不是MVC直接传递的页面我不确定如何配置它。

我还希望能够将 app.html 文件保留在原位,因为它使用与之相关的资源,并且在使用Sencha时也更容易将其保留在那里建筑师。

2 个答案:

答案 0 :(得分:4)

这会阻止浏览器缓存:

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

为每个回复添加Cache-ControlPragmaExpires标头。更多信息可在参考文档的Security HTTP Response Headers部分找到。

更新:此答案是针对Spring Security的 3.2版编写的。从版本4开始,默认情况下包含这些标头。

答案 1 :(得分:1)