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 中的文件夹

PHP Files functions

CDI 是 Spring 的一个很好的替代品吗? [关闭]

nodejs Yarn替代npm的包管理——快速安全可靠性高的依赖管理

Liferay7 BPM门户开发之42: Liferay核心JSP定制扩展