glassfish 替代 docroot 的 JBoss 等效性
Posted
技术标签:
【中文标题】glassfish 替代 docroot 的 JBoss 等效性【英文标题】:JBoss equivalence of glassfish alternate docroot 【发布时间】:2013-08-08 04:37:58 【问题描述】:使用 Glassfish 非常容易:
考虑一下我在 unix /apps/static_content/
上的绝对路径。
使用 Glassfish,我将简单地将 alternate doc root 定义为:
<property name="alternatedocroot_1"
value="from=/static/* dir=/apps/static_content/"/>
当我上传我的图像和其他数据文件时,我可以将它们保存到/apps/static_content
目录,在我的 JSF 页面中我可以正常显示我的静态内容:
<p:graphicsimage value="/static/external_web_app.png"/>
我真的需要在 JBoss AS7 中实现同样的功能
我该怎么做?
【问题讨论】:
JBoss 不支持这样的东西。 【参考方案1】:这个问题有点老了,但是如果有人需要使用较新版本的 JBoss/Wildfly 来回答这个问题。
JBoss AS 从版本 8 重命名为 Wildfly(即 Wildfly 8 是 JBoss AS 8),Red Hat 支持的 JBoss 版本重命名为 JBoss EAP。所以这适用于:
Wildfly(任何版本) JBoss EAP(从版本 7 开始)首先要注意的是 glassfish 中的“备用文档根”功能不能这样工作。请查看此问题以了解此功能的行为:Alternate docroot not working on glassfish 4
现在,要回答这个问题,JBoss/Wildfly 是在 Undertow 的基础上构建的,它可以让您完全按照自己的需要去做。请参阅此问题,了解如何将 undertow 配置为静态内容的 Web 服务器:How to configure Wildfly to serve static content (like images)?
【讨论】:
更新您的答案并添加适用的版本。【参考方案2】: 选项 1:您可以尝试部署一个单独的已分解 .war 文件,并将其用于您的静态内容在您的情况下:.../jboss-7/standalone/deployments/
中必须有一个 static.war/
。
所以上传到这个目录,内容以正常方式返回。
详情见Is it possible to deploy an exploded war file (unzipped war) in JBoss AS 7
正如 BalusC 所指出的:一旦上传数据,您就不能重新部署/删除此目录。您应该定期备份此目录。
据我所知,这是仅通过配置/设置的唯一可能性。
选项 2:创建名称为
static.war
的单独 Web 应用。添加 servlet 以流式传输静态内容
这样就不需要将文件上传/存储到../deployments/
下面的文件系统中,它可以是任何目录,但是你需要一个额外的servlet,所以它是通过编程来解决的。
一个简单的流式处理 servlet 可能如下所示(只是流式传输 - 没有身份验证等):
public class DownloadServlet extends HttpServlet
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
final File dir = new File("/var/cms/storage/");
final String start = "/static/";
final String relativePath = request.getRequestURI().substring(
request.getRequestURI().indexOf(start) + start.length());
final File file = new File(dir, relativePath);
final String ct = URLConnection.guessContentTypeFromName(file.getName());
response.setContentType(ct);
final InputStream is =
new BufferedInputStream(new FileInputStream(file));
try
final boolean closeOs = true;
org.apache.commons.fileupload.util.Streams.copy
(is, response.getOutputStream(), closeOs);
finally
is.close();
将所有 URL 映射到该 servlet:
<servlet-mapping>
<servlet-name>DownloadServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
名称 static.war
提供了 /static/
网络上下文,因此它应该与您代码中的 URL 兼容。
【讨论】:
OP 旨在保存上传的文件并将其返回。这不与 WAR 一起使用。 @BalusC 它可能没有被指定/支持,可能数据中心不会喜欢它。我已经对其进行了测试,它使用 JBoss 7.1.1 的爆炸 .war 工作:我可以将文件上传到该目录,并以正常方式返回工作。 直到您重新部署 WAR。 @BalusC 谢谢,我已将此提示添加到答案中。 不,只是不要将上传的文件保存在部署文件夹中。相关答案:***.com/questions/8885201/…和***.com/questions/4543936/…【参考方案3】:如果你探索 jboss 目录,你会发现有很多你可以用来存储不同类型的数据,比如 jboss.serer.data.dir。
您可以尝试通过系统属性询问此目录路径,并将您的服务正在使用的数据存储在该目录下的文件夹中。
String path = System.getProperty("jboss.server.data.dir");
然后您可以根据需要使用 path,如果只是静态的,如您的示例中所示,则直接设置目录的名称。
这应该可行,我希望 :p
ps:正如上一个答案所暗示的,保存的数据将保留在目录中,您不得重新部署/删除此目录..它将保留您的数据..
【讨论】:
我如何在我的 jsf 页面中访问此路径? 使用 servlet 或 backing bean 以及返回所需路径的简单方法。以上是关于glassfish 替代 docroot 的 JBoss 等效性的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Ubuntu 下修复 apache 错误“不在配置的 docroot 中”
如何使用虚拟主机将动态子域提供给位于 docroot 中的文件夹