java - 如何从内部服务器在 Java Web 应用程序中提供静态内容?
问题描述
这是一个标准(可能是微不足道的)情况,但我找不到有关该主题的详细信息。
假设我们有一个 Web 应用程序A ( http://my-webapp
) 和一个文件服务器F ( http://file-server
)。
为了清楚起见:
- A在 Jetty 9 上运行;
- F对 Jetty 服务器可见,对客户端不可见。
在A中显示存储在F上的图片的最佳做法是什么?
假设客户端发出一个请求http://my-webapp/pictures/123
,其中123
任何 id,它以某种方式指向存储为的图片http://file-server/storage/xxx123.jpg
,并希望在浏览器中看到该图片。
解决方案
我建议以下解决方案作为一个最小的示例,这可能是一个很好的起点。
重定向.htaccess
似乎在低级别做类似的事情。
实际上,这个问题应该由 Web 应用程序服务器本身来解决,而无需外部工具(如 Apache httpd 或 Nginx)的干预。
1.在web.xml中声明servlet
<servlet>
<servlet-name>pictures</servlet-name>
<servlet-class>myapplication.servlets.HiddenFileServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>pictures</servlet-name>
<url-pattern>/pictures/*</url-pattern>
</servlet-mapping>
2.实现servlet
public class HiddenFileServlet extends HttpServlet
{
@Inject
MyService myService; // a service for paths finding on http://file-server
@Override
protected void doGet( HttpServletRequest req, HttpServletResponse resp ) throws IOException
{
String requestedUri = req.getRequestURI();
String fileName = myService.getFileName( requestedUri );
String mime = getServletContext().getMimeType( fileName );
if ( mime == null )
{
resp.setStatus( HttpServletResponse.SC_INTERNAL_SERVER_ERROR );
return;
}
else
{
resp.setContentType( mime );
}
// path on http://file-server/storage
URL fileFullPath = myService.getInternalPath( requestedUri );
URL file = new URL( fileFullPath );
try (
InputStream in = file.openStream();
OutputStream out = resp.getOutputStream()
)
{
org.apache.commons.compress.utils.IOUtils.copy( in, out );
}
}
}
推荐阅读
- python - 用另一列中的值替换特定单词
- input - 如何使 AEM/CRX 中的输入字段成为必需?
- git - 为什么我们第一次使用 git remote add origin?
- javascript - React 添加延迟以在状态中应用类
- android - 无法转换工件 com.twilio:video-android
- arrays - 如何在打字稿的对象数组中找到具有相同属性值的对象?
- python - C++ - 如何将大数组作为函数的输入
- reactjs - 访问 React 组件中的 HTML 元素
- java - 将字符串列表转换为包含这些字符串作为字段的对象列表
- excel - 将多个值存储到字典中