9

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

不太了解 PHP,我不确定 PHP.htaccess等的 Tomcat/JBoss 类似物是什么。如果我必须编写自己的自动版本控制,我该从哪里开始?原理对我来说很清楚 - 使用文件的时间戳重写 URL,但我对使用 JBoss/Tomcat 重写 URL 知之甚少。


更新:

结合Pascalnovice推荐的方法,我得到了以下结果:

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>

3.将 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新手的帮助。

4

3 回答 3

4

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

方法:

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

脚步:

  • 在类路径中包含 urlrewritefilter.jar(从http://www.tukey.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
    • 应用出站规则后: /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 或类似的构建工具,版本更新可以自动进行
于 2010-09-15T16:00:15.803 回答
3

如果您不想在应用程序前面使用 Apache HTTPD,那么您可以使用自定义 servlet 过滤器或重用现有的Url Rewrite Filter。此过滤器基于 Apache mod_rewrite,并提供类似的功能。换句话说,它将允许实现与 PHP 相同的解决方案之一。


我以前见过 URL 重写过滤器。您能否详细说明我将如何使用它?我真的不清楚如何对这个问题应用过滤器,因为我不会完全调用包装在每个包含的 JS/CSS 文件周围的 JSP/JSTL 函数,而且我不知道如何获取从 WAR 中的文件修改的日期。

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

  1. 设置 Url Rewrite Filter 以将任何请求重写/css/my.123456.css/css/my.css
  2. 实现一个ServletFile在 WAR 中获取给定资源的对象并插入File#lastModified()到该资源的返回路径中。
  3. Servlet从 JSP 为 CSS调用它。

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

  1. 将服务器启动时间从 a ServletContextListener(比如在 key 下"key")放在应用程序范围内。
  2. 在你 JSP

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

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


在网上搜索一些可以帮助实现选项 1 的步骤 #2 的代码时,我发现 Springo.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 的最佳选择。

于 2010-04-19T13:38:03.263 回答
1

我们在我们的网络应用程序中执行以下操作:

  1. 构建过程检索 Subversion 存储库编号并将其存储在 Web 应用程序的属性中。
  2. 构建过程还为包含此修订号的 WAR 中的静态资产创建目录结构:/assets/1234/styles/...
  3. 过滤器/拦截器将资产路径(包括修订号)作为属性放入所有请求中
  4. Jsp模板使用这个资产路径属性来构造资产的URLS
于 2010-04-22T16:42:59.520 回答