【发布时间】:2016-05-18 21:40:47
【问题描述】:
我在使用 shiro 保护我的 .html 文件时遇到问题。
我的应用是带有休息调用的 .html/jquery。
- 用户点击登陆页面重定向到 /secure/index.html
- 用户登录。
- 用户重定向到安全页面 /secure/index.html
- 用户注销并转到/logout.html(shiro 确认注销)
- 输入浏览器地址“/secure/index.html”,页面为 尽管已注销,但仍显示。
在第 5 步。访问,日志没有显示任何活动。 根据 chrome 开发者工具,页面正在从缓存中加载。
问题似乎是浏览器没有重新加载页面,因此 shiro 过滤器永远不会触发,并且安全 html 文件的内容是可见的。
很明显浏览器缓存绕过了shiro auth。
只有当我 Ctl+F5 刷新时,页面才会从码头重新加载并激活安全性。
shiro.ini
======================
authc.loginUrl = /login.html
authc.usernameParam = username
authc.passwordParam = password
authc.rememberMeParam = remember
logout.redirectUrl = /logout.html
解决方案 #1
我的解决方案是强制浏览器在 .html 文件上设置“无缓存”。 但是我想要对我的静态内容进行缓存控制。
我知道 DefaultServlet 可以做到这一点,所以我创建了另外 2 个 DefaultServlet 实例(staticDefaultServlet 和 webDefaultServlet)来为我的内容提供不同的缓存控制标头。
<servlet>
<servlet-name>webDefaultServlet</servlet-name>
<servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
<init-param>
<param-name>cacheControl</param-name>
<param-value>max-age=5,no-store</param-value>
</init-param>
<init-param>
<param-name>pathInfoOnly</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>staticDefaultServlet</servlet-name>
<servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class>
<init-param>
<param-name>cacheControl</param-name>
<param-value>max-age=604800</param-value>
</init-param>
<init-param>
<param-name>pathInfoOnly</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>staticDefaultServlet</servlet-name>
<url-pattern>/static/**</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>webDefaultServlet</servlet-name>
<url-pattern>/pages/**</url-pattern>
</servlet-mapping>
但是缓存标头没有通过。
问题
第一季度。我可以使用多个 DefaultServlet 实例来为不同的路径设置不同的每个控件吗?
第二季度。是否有另一种机制可以用 shiro 保护 .html 文件?
谢谢
-lp
【问题讨论】: