我在使用shiro保护我的.html文件时遇到问题。
我的应用是.html / jquery,有休息电话。
在第5步。访问,日志没有显示任何活动。 根据chrome开发人员工具,页面正在从缓存中加载。
问题似乎是浏览器没有重新加载页面,因此shiro过滤器永远不会被触发,并且安全html文件的内容是可见的。
很明显,浏览器缓存会绕过shiro auth。
只有i Ctl + F5刷新才能从jetty重新加载页面并激活安全性。
shiro.ini
======================
authc.loginUrl = /login.html
authc.usernameParam = username
authc.passwordParam = password
authc.rememberMeParam = remember
logout.redirectUrl = /logout.html
我的解决方案是强制浏览器在.html文件上设置“无缓存”。 但是我想要对我的静态内容进行缓存控制。
我知道DefaultServlet可以这样做,所以我创建了另外两个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>
然而,缓存标头不会通过。
Q1。我可以使用多个DefaultServlet实例来为不同的路径设置不同的每个控件吗?
Q2。是否有另一种机制用shiro保护.html文件?
感谢
-lp
答案 0 :(得分:0)
这太难了。
我放弃了defaultservlet解决方案,而是使用Filter来管理不同路径的cacheControl。
public class CacheControlFilter implements Filter
{
String cacheControl;
//@Override
public void init(FilterConfig filterConfig) throws ServletException
{
cacheControl = filterConfig.getInitParameter("cacheControl");
}
//@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
if (response instanceof HttpServletResponse)
{
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.addHeader("Cache-Control", cacheControl);
}
chain.doFilter(request, response);
}
并部署在web.xml
中<filter>
<filter-name>WebCacheControlFilter</filter-name>
<filter-class>com.asteriski.itaxreport.filter.CacheControlFilter</filter-class>
<init-param>
<param-name>cacheControl</param-name>
<param-value>no-cache, no-store, must-revalidate</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>WebCacheControlFilter</filter-name>
<url-pattern>/pages/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
-lp