Tomcat 使用JBoss自动控制静态内容的版本

Tomcat 使用JBoss自动控制静态内容的版本,tomcat,caching,jboss,auto-versioning,Tomcat,Caching,Jboss,Auto Versioning,根据问答,我想为运行在JBoss5中的web应用程序实现一个类似的自动版本控制系统。已经有什么东西可以做这种事情了,还是我需要自己写点东西?需要说明的是:我没有使用PHP。 由于对PHP了解不多,我不确定PHP的.htaccess等的Tomcat/JBoss类似物是什么。如果我必须编写自己的自动版本控制,我从哪里开始?原则对我来说很清楚——使用文件的时间戳重写URL,但我对使用JBoss/Tomcat重写URL知之甚少 更新: 结合和推荐的方法,我得出以下结论: 1。自定义和标记,这样我就不必

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

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


更新: 结合和推荐的方法,我得出以下结论:

1。自定义
标记,这样我就不必到处看到
标记

<%@ 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>
3.向每个新会话(或多或少…)注入缓存变量,应用程序部署
时间戳:

// 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>

^/静态/(css | js |图像)/(*)$
%{context path}/static/%{会话属性:cacheBust}/$1/$2
^/静态/\d{10}/(css | js |图像)/(.*)$
/静态/$1/$2


非常感谢并感谢他们的帮助。

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



我以前见过URL重写过滤器。你能详细说明一下我是怎么用的吗?我真的不清楚如何将过滤器应用于这个问题,因为我不会调用围绕每个包含的JS/CSS文件的JSP/JSTL函数,我也不知道如何从处于战争状态的文件中修改日期

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

  • 设置Url重写筛选器,以将任何说
    /css/my.123456.css
    的请求重写为
    /css/my.css
  • 实现一个
    Servlet
    ,该Servlet将为WAR中的给定资源获取一个
    File
    对象,并将
    File\lastModified()
    插入到该资源的返回路径中
  • 从CSS的JSP调用该
    Servlet

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

  • 将服务器启动时间从a放入应用程序范围(例如,在键
    下的“键”
  • 在您的JSP中

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

    并将其
    applyLastModified
    属性设置为
    true
    。我对javadoc的理解是,它应该做到这一点。这是选项3,如果在不存在问题的情况下添加对此servlet的依赖项,这是IMO的最佳选项。

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

  • 构建过程检索Subversion存储库编号并将其存储在web应用程序中的属性中
  • 构建过程还为WAR中的静态资产创建一个目录结构,其中包含此修订号:/assets/1234/styles/
  • 过滤器/拦截器将资产路径(包括修订号)作为属性放入所有请求中
  • Jsp模板使用此资产路径属性为资产构造URL

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

    方法:

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

    • 在类路径中包含urlrewritefilter.jar(从中获取)
    • 使用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>
      
      
      URL重写过滤器
      org.tuckey.web.filters.urlrewrite.UrlRewriteFilter
      URL重写过滤器
      /五/*
      
    • 更新jsp文件中的“abc.js”,例如

      <html>
          <head>
              <script type="text/javascript" src="<c:url value="/v/js/abc.js"/>"></script>
          </head>
      </html>
      
      <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>
      
      
      
    • 编写urlrewritefilter.xml,例如

      <html>
          <head>
              <script type="text/javascript" src="<c:url value="/v/js/abc.js"/>"></script>
          </head>
      </html>
      
      <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>
      

      
      ^/v/(css | js | static)/(.*)$
      %{context path}/v/updateVersionNumberHere/$1/$2
      ^/v/updateVersionNumberHere/(css | js |静态|图像)/(.*))$
      /$1/$2
      

      说明:

      当jsp服务于客户端时

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

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

      • 传入url:/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或类似的构建工具,版本更新可以自动化

    我以前见过URL重写过滤器。你能详细说明一下我是怎么用的吗?我真的不清楚如何将过滤器应用于这个问题,因为我不会调用围绕每个包含的JS/CSS文件的JSP/JSTL函数,我也不知道如何从一个处于战争状态的文件中修改日期。他不是这样认为的