由于缓存而使用jetty和shiro保护,html

时间:2016-02-09 02:36:42

标签: jetty shiro jetty-9

我在使用shiro保护我的.html文件时遇到问题。

我的应用是.html / jquery,有休息电话。

  1. 用户点击着陆页重定向到/secure/index.html
  2. 用户登录。
  3. 用户重定向到安全页面/secure/index.html
  4. 用户注销并转至/logout.html(shiro确认注销)
  5. 输入浏览器地址" /secure/index.html"而页面是 尽管已经退出,但仍然显示出来。
  6. 在第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 
    

    解决方案#1

    我的解决方案是强制浏览器在.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

1 个答案:

答案 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