【问题标题】:securing ,html with jetty and shiro due to caching由于缓存,使用 jetty 和 shiro 保护 html
【发布时间】:2016-05-18 21:40:47
【问题描述】:

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

我的应用是带有休息调用的 .html/jquery。

  1. 用户点击登陆页面重定向到 /secure/index.html
  2. 用户登录。
  3. 用户重定向到安全页面 /secure/index.html
  4. 用户注销并转到/logout.html(shiro 确认注销)
  5. 输入浏览器地址“/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

【问题讨论】:

    标签: jetty shiro jetty-9


    【解决方案1】:

    这太难了。

    我放弃了 defaultservlet 解决方案,而是使用过滤器来管理不同路径的 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

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 2012-06-13
      • 2013-12-29
      • 2012-08-03
      • 2011-01-12
      • 2022-11-16
      • 2015-06-16
      • 2012-02-05
      • 2016-10-08
      相关资源
      最近更新 更多