从与服务相同的目录提供静态内容 - Dropwizard

Posted

技术标签:

【中文标题】从与服务相同的目录提供静态内容 - Dropwizard【英文标题】:Serving Static Content from same directory as service - Dropwizard 【发布时间】:2013-12-03 07:08:52 【问题描述】:

我正在构建一个 Dropwizard 应用程序来替换旧版网络服务器,由于指向该服务器的大量链接,我必须向后兼容并支持旧版服务器曾经服务的各种资源。

问题是我有一堆静态 JS 文件从与服务本身相同的目录/路径提供。显然,您不能从单个目录同时提供两种类型(服务和静态)。所以如果我添加静态包(现在位于资源目​​录中),如下所示:

bootstrap.addBundle(new AssetsBundle("/javascript", "/media")); 

动态服务(从 /media/ 提供)开始返回 404 如果我评论它,动态服务工作正常。

正如我所说,我无法更改任何链接,无论是静态的还是动态的... 有什么建议吗?

更新:

已解决,这是一个受@airborn 回答启发的工作示例,这个question 也将我指向this module,它声称可以通用地解决这个问题。

此示例将对所有传入请求应用过滤器,并允许您重定向到您想要的任何位置(类似于 apache 上的 .htaccess 功能)。

将以下行放在你的 主要 dropwizard 类的运行函数中(扩展 **Service<AppConfiguration> **

environment.addFilter(new UrlRewriteFilter(),"/*");

把这个类放在上面的类可以访问的地方

@WebFilter
public class UrlRewriteFilter implements Filter 

    @Override
    public void init(FilterConfig config) throws ServletException 
        //
    

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException 
        HttpServletRequest request = (HttpServletRequest) req;
        String requestURI = request.getRequestURI();
        // Place Redirection logic here (else continues the filter chain).
        if (redirectConditionTrue)
            String newURI = ""//New URl to do to;
            req.getRequestDispatcher(newURI).forward(req, res);
         else 
            chain.doFilter(req, res);
        
    

    @Override
    public void destroy() 
        //
    

【问题讨论】:

对于任何阅读本文的人,请注意示例 UrlRewriteFilter 类确实无论如何都使用tuckey.org/urlrewrite Url-rewriter - 它只是一个标准的 Servlet 过滤器。 【参考方案1】:

在您的Service 类中使用Environment,您应该能够向Jetty 添加过滤器。在这个代理过滤器中,您应该能够检测到那些 js 文件并将它们重定向到新位置。

【讨论】:

我以前看过带有过滤器的示例,但没有一个带有带有 Environment.addFilter 的 dropwizard 的示例 - 所以这是缺少的部分 - 谢谢!将更完整的示例附加到问题...

以上是关于从与服务相同的目录提供静态内容 - Dropwizard的主要内容,如果未能解决你的问题,请参考以下文章

Bash - 从与脚本文件位于同一目录中的文件读取

无法使用 Ktor 提供静态内容

从与插入或更新相同的表中选择

从与 eclipse 相同的控制台运行 maven 命令

为啥我无法从与设置文件相同的项目/程序集中为设置选择自定义类型?

从与.jar文件位于同一文件夹的文件中读取