在Web应用程序外部提供图像

时间:2013-06-04 09:48:43

标签: java java-ee jetty tapestry

我想访问静态文件,这些文件位于我的Web应用程序之外的已知目录中。我已经在www上阅读了很多选项,但我仍然有一些问题。

基本上我想为我的应用服务器的defaultservlet声明一个上下文。在我的情况下,我正在尝试Tapestry教程,这是一个基于Maven的项目并导入到eclipse。

想法是创建一个httpservlet,从该位置获取文件。有人知道我在哪里可以找到这样一个servlet的例子,我怎么能打电话给他?我知道servlet可能必须被声明为一个服务,因为应用程序的所有页面都需要访问这些文件,但我也可能会弄错,只需在布局页面中导入它(所有页面都使用) layout.tml文件)。我基本上没有任何线索如何使用servlet。有人能告诉我光明吗?

非常坦克。

2 个答案:

答案 0 :(得分:3)

另一个更简单的解决方案是创建一个返回流响应的页面

public class StaticFile {
    StreamResponse onActivate(String fileName) {
        return new StaticFileStreamResponse(fileName);
    }
}

然后在另一个组件/页面

@Inject ComponentResources resources;

public Link getStaticFileLink() {
   return resources.createPageRenderLinkWithContext("StaticFile", "path/to/myFile.jpg");
}

TML

<img src="${StaticFileLink}" />

但是你不会在我的其他解决方案中利用tapestry的304 NOT_MODIFIED响应。

答案 1 :(得分:2)

这种做法的挂毯方式是提供AssetRequestHandlerAssetFactory

AppModule.java

public static void contributeAssetDispatcher(
        MappedConfiguration<String, AssetRequestHandler> config,
        ResourceStreamer streamer)
{
   config.add("staticfile", new StaticFileAssetRequestHandler(streamer));
}

public void contributeAssetSource(
        MappedConfiguration<String, AssetFactory> config)
{
    config.add("staticfile", new StaticFileAssetFactory());
}

然后在你的tml中你可以使用

<img src="${asset:staticfile:path/to/myFile.jpg}" />

查看ContextAssetRequestHandler,ClasspathAssetRequestHandler,ContextAssetFactory和ClasspathAssetFactory以获取灵感。

小心不要打开一个安全漏洞,黑客可以通过传递前缀为../../

的文件路径来访问服务器上的任何文件
相关问题