使用JBoss自动版本化静态内容

Mat*_*all 9 jboss tomcat caching auto-versioning

根据这里的问答,我想为在JBoss 5中运行的Web应用程序实现类似的自动版本系统.有什么东西可以用来做这种事情,还是我需要自己写一些东西?要明确:我没有使用PHP.

不太了解PHP,我不确定PHP的Tomcat/JBoss类似物.htaccess是什么.如果我必须编写自己的自动版本,我会从哪里开始?原理很清楚 - 使用文件的时间戳重写URL,但我不太了解使用JBoss/Tomcat进行URL重写.


更新:

结合Pascal新手推荐的方法,这就是我最终得到的结果:

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>
Run Code Online (Sandbox Code Playgroud)

2.相当紧随新手的步骤,但映射UrlRewriteFilter/*在web.xml中:

<filter-mapping>
    <filter-name>UrlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)

3.向每个新会话(或多或少......)注入CACHE_BUST变量,应用程序部署 timestamp:

// On application deploy:
long CACHE_BUST = System.currentTimeMillis() / 1000;

// later...
session.setAttribute("cacheBust", CACHE_BUST);
Run Code Online (Sandbox Code Playgroud)

4. ...so that I can use these rules in 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>
Run Code Online (Sandbox Code Playgroud)

非常感谢Pascal新手的帮助.

nov*_*ice 4

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

方法:

  • 将产品版本号(版本号)附加到jsp文件中的js/css/images/static内容url中
  • 浏览器会缓存 (js/css/static) 文件,其 url 包含版本号
  • 当新版本发布时,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>
    
    Run Code Online (Sandbox Code Playgroud)
  • 更新jsp文件中的'abc.js',例如,

    <html>
        <head>
            <script type="text/javascript" src="<c:url value="/v/js/abc.js"/>"></script>
        </head>
    </html>
    
    Run Code Online (Sandbox Code Playgroud)
  • 编写 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>
    
    Run Code Online (Sandbox Code Playgroud)

    解释:

    当jsp提供给客户端时

    • jsp中提到的url: /v/js/abc.js
    • 应用出站规则后: /contextPath/v/3.4.5/js/abc.js

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

    • 传入网址: /contextPath/v/3.4.5/js/abc.js
    • 应用规则后: /js/abc.js

要点:

  • 浏览器将捕获 url /contextPath/v/3.4.5/js/abc.js 的 js 文件,接下来部署新版本的 jsp 文件,它们可能具有 url /contextPath/v/4.5.6/js/abc。 js,所以浏览器会调用js文件而不是使用缓存的js文件。
  • 如果您使用 Maven 或类似的构建工具,版本更新可以自动化