根据Q& A here,我想为在JBoss 5中运行的Web应用程序实现类似的自动版本系统。是否有任何东西可以用来做这种事情,或者我需要自己写点什么吗?要明确:我没有使用PHP。
不太了解PHP,我不确定PHP的.htaccess
等的Tomcat / JBoss类似物是什么。如果我必须编写自己的自动版本,我会从哪里开始?原理很清楚 - 使用文件的时间戳重写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。非常接近新手的步骤,但在web.xml中将UrlRewriteFilter
映射到/*
:
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3. 为每个新会话(或多或少......)注入CACHE_BUST变量,应用程序部署
时间戳:< / p>
// 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>
答案 0 :(得分:4)
以下解决方案更适合生产环境,因为您将增加每个版本的版本号。
<强>方法强>
<强>步骤:强>
使用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投放到客户端
当浏览器调用js / css / static files
时<强>点数:强>
答案 1 :(得分:3)
如果您不想使用Apache HTTPD前置您的应用程序,那么您可以使用自定义servlet过滤器或重用现有的Url Rewrite Filter。此过滤器基于Apache的mod_rewrite
并提供类似的功能。换句话说,它将允许实现与另一个答案中的PHP相同的解决方案。
之前我见过URL重写过滤器。你能详细说明我如何使用它吗?我真的不清楚如何将过滤器应用于这个问题,因为我不会完全调用包含在每个包含的JS / CSS文件中的JSP / JSTL函数,而且我不知道如何获取从WAR中的文件修改日期。
嗯,这个想法是模仿你所链接答案的“PHP解决方案”(让我们称之为选项1):
/css/my.123456.css
中的任何请求重写为/css/my.css
Servlet
,它将获得WAR内给定资源的File
对象,并在返回该资源的路径中插入File#lastModified()
。Servlet
。另一种方法(选项2)是将唯一的查询字符串附加到静态内容的URL,例如,服务器启动时间:
ServletContextListener
的应用范围内(例如,在密钥"key"
下)。在JSP中
<link rel="stylesheet" type="text/css" href="/css/my.css?${key.startupTime}">
亲:没有网址重写的东西了。 Con:不太理想(内容将在重启时请求)但可接受。
在网上搜索有助于实现选项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的最佳选择。
答案 2 :(得分:1)
我们在网络应用中执行以下操作: