代码之家  ›  专栏  ›  技术社区  ›  Matt Ball

用jboss实现静态内容的自动版本控制

  •  9
  • Matt Ball  · 技术社区  · 15 年前

    根据Q&A here ,我想为运行在jboss 5中的web应用程序实现一个类似的自动版本控制系统。已经有什么东西可以做这种事了,或者我需要自己写点什么吗?清楚: 我没有使用php。

    由于对php了解不多,我不确定tomcat/jboss与php的类似之处 .htaccess 等等。如果我必须编写自己的自动版本控制,我应该从哪里开始?原则对我来说很清楚——使用文件的时间戳重写url,但我对用jboss/tomcat重写url知之甚少。


    更新:

    结合 Pascal novice ,以下是我的结局:

    1。 习俗 <my:script/> <my:style/> 标签,这样我就不用看了 <c:url/> 到处都有标签。

    <%@ tag body-content="empty" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ attribute name="src" required="true" rtexprvalue="true" %>
    <script src="<c:url value="${src}" />"></script>
    

    2。 遵循新手的步骤,但是映射 UrlRewriteFilter /* 在Web.xml中:

    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    三。 将cache-bust变量注入到每个新会话(或多或少…),应用程序部署 时间戳:

    // On application deploy:
    long CACHE_BUST = System.currentTimeMillis() / 1000;
    
    // later...
    session.setAttribute("cacheBust", CACHE_BUST);
    

    4。 …这样我就可以在 urlrewrite.xml :

    <outbound-rule>
        <from>^/static/(css|js|images)/(.*)$</from>
        <to>%{context-path}/static/%{session-attribute:cacheBust}/$1/$2</to>
    </outbound-rule>
    
    <rule>
        <from>^/static/\d{10}/(css|js|images)/(.*)$</from>
        <to>/static/$1/$2</to>
    </rule>
    

    多亏了 Pascal novice 为了他们的帮助。

    3 回复  |  直到 10 年前
        1
  •  4
  •   Maniganda Prakash    14 年前

    下面的解决方案更适合于生产环境,因为您将增加每个版本的版本号。

    途径:

    • 将产品版本号(版本号)附加到jsp文件中的js/css/images/static content url
    • 浏览器将使用包含版本号的url缓存(js/css/static)文件
    • 当新版本发布时,jsp文件将包含js/css/static文件的url和新版本号,因此浏览器将进行调用,因为它找不到新url的内容

    步骤:

    • 在类路径中包含urlRewriteFilter.jar(从 http://www.tuckey.org/urlrewrite/ )
    • 使用url模式更新web.xml,例如,

      <filter>
          <filter-name>urlRewriteFilter</filter-name>
          <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
      </filter>
      
      <filter-mapping>
        <filter-name>urlRewriteFilter</filter-name>
        <url-pattern>/v/*</url-pattern>
      </filter-mapping>
      
    • 在jsp文件中更新'abc.js',例如,

      <html>
          <head>
              <script type="text/javascript" src="<c:url value="/v/js/abc.js"/>"></script>
          </head>
      </html>
      
    • 编写urlRewriteFilter.xml,例如,

      <outbound-rule>
          <from>^/v/(css|js|static)/(.*)$</from>
          <to>%{context-path}/v/updateVersionNumberHere/$1/$2</to>
      </outbound-rule>
      
      <rule>
          <from>^/v/updateVersionNumberHere/(css|js|static|images)/(.*)$</from>
          <to>/$1/$2</to>
      </rule>
      

      说明:

      当jsp服务于客户机时

      • jsp中提到的url: /V/JS/ABC JS
      • 应用出站规则后: /上下文路径/v/3.4.5/js/abc.js

      当浏览器调用js/css/static文件时

      • 传入URL: /上下文路径/v/3.4.5/js/abc.js
      • 应用规则后: /JS/ABC JS

    要点:

    • 浏览器将捕获url/contextpath/v/3.4.5/js/abc.js的js文件,接下来部署一个新版本的js文件,它们可能有url/contextpath/v/4.5.6/js/abc.js,因此浏览器将调用js文件,而不是使用缓存的js文件。
    • 如果使用maven或类似的构建工具,则可以自动更新版本
        2
  •  3
  •   Pascal Thivent    14 年前

    如果您不想使用apache httpd作为应用程序的前端,那么可以使用自定义的servlet过滤器或重用现有的 Url Rewrite Filter . 这个过滤器基于apache的 mod_rewrite 并提供类似的功能。换句话说,它将允许实现与php相同的解决方案(另一个答案之一)。


    我以前见过url重写过滤器。你能详细说明一下我怎么用吗?我真的不清楚该如何对这个问题应用过滤器,因为我不会调用包装在每个包含的js/css文件周围的jsp/jstl函数,我也不知道如何从处于战争状态的文件中修改日期。

    好吧,我们的想法是完全模仿您链接到的答案的“php解决方案”(我们称之为选项1):

    1. 设置url重写过滤器以重写要说的任何请求 /css/my.123456.css 进入之内 /css/my.css
    2. 实施一 Servlet 会得到一个 File 对象,在war中为给定资源插入 File#lastModified() 在返回到该资源的路径中。
    3. 调用 小服务程序 从jsp获取css。

    另一种方法(选项2)是将唯一的查询字符串附加到静态内容的url,例如服务器启动时间:

    1. 将服务器启动时间从 ServletContextListener (在钥匙下面说 "key" )
    2. 在你的JSP中

      <link rel="stylesheet" type="text/css" href="/css/my.css?${key.startupTime}">
      

    专家:不再有url重写的东西了。缺点:不太理想(内容将在重新启动时请求),但可以接受。


    当我在网上搜索一些可以帮助实现选项1的步骤2的代码时,我发现了spring的 o.s.w.s.ResourceServlet 这是做类似的事情,你可以看看它的源代码。但是,在更仔细地阅读它的javadoc时,我意识到这个servlet实际上正是您要寻找的。按如下方式映射:

    <servlet>
      <servlet-name>Resource Servlet</servlet-name>
      <servlet-class>org.springframework.web.servlet.ResourceServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>Resource Servlet</servlet-name>
      <url-pattern>/static/*</url-pattern>
    </servlet-mapping>
    

    并设置它的 applyLastModified 属性到 true . 我对javadoc的理解是它应该做到这一点。这是选项3,如果在没有问题的情况下添加对这个servlet的依赖,这是imo的最佳选项。

        3
  •  1
  •   Eric R. Rath    14 年前

    我们在Web应用程序中执行以下操作:

    1. 构建过程检索subversion存储库号并将其存储在web应用程序中的属性中。
    2. 构建过程还为war中的静态资产创建了一个目录结构,其中包含了这个修订号:/assets/1234/styles/…
    3. 过滤器/拦截器将资产路径(包括修订号)作为属性放入所有请求中
    4. jsp模板使用这个assets path属性为资产构造url