我有一个使用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时也更容易将其保留在那里建筑师。
答案 0 :(得分:4)
这会阻止浏览器缓存:
<http>
<!-- ... -->
<headers>
<cache-control />
</headers>
</http>
为每个回复添加Cache-Control
,Pragma
和Expires
标头。更多信息可在参考文档的Security HTTP Response Headers部分找到。
更新:此答案是针对Spring Security的 3.2版编写的。从版本4开始,默认情况下包含这些标头。
答案 1 :(得分:1)
您可以选择以下其中一项,具体取决于您的应用程序将如何为资源请求提供服务。