Может ли Spring помочь предотвратить кэширование HTML-страниц в браузере?
У меня есть веб-приложение Java/Spring 3.x, использующее ExtJS, и я использую 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>
Я хочу защитить этот html-файл с помощью безопасности Spring, и это, кажется, работает, за исключением того, что он часто кэшируется в браузере, так что он, кажется, перезагружается, даже если пользователь не вошел в систему. Вот мой Spring XML, который настраивает безопасность для моего веб-приложения:
<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, чтобы заставить страницу истечь, но так как это страница, которая обычно доставляется непосредственно контейнером сервлета, а не MVC, я не уверен, как я это настрою.
Я также хотел бы иметь возможность оставить мой файл app.html на месте, так как он использует ресурсы, относящиеся к нему, и также проще оставить его там при работе с Sencha Architect.
2 ответа
Это предотвратит кеширование браузера:
<http>
<!-- ... -->
<headers>
<cache-control />
</headers>
</http>
Добавляет Cache-Control
, Pragma
а также Expires
заголовки для каждого ответа. Более подробную информацию можно найти в справочной документации, раздел Безопасность HTTP заголовки ответа.
Обновление: этот ответ был написан для версии 3.2 Spring Security. Начиная с версии 4, эти заголовки включены по умолчанию.
Вы можете выбрать один из следующих пунктов, который зависит от того, как ваше приложение будет обслуживать запросы ресурсов.
Использование Spring Security http://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html
Использование Extjs http://www.sencha.com/forum/showthread.php?257086-Is-there-a-simple-way-to-disable-caching-for-an-entire-ExtJS-4-application
Использование HTML http://www.htmlgoodies.com/beyond/reference/article.php/3472881