【问题标题】:How do I code my servlet so it works nicely with Cloudfront Cache如何对我的 servlet 进行编码,以便它与 Cloudfront Cache 很好地配合使用
【发布时间】:2015-06-15 00:33:34
【问题描述】:

我的 servlet 应用程序部署到 direct.albunack.net,并且在 www.albunack.net 有一个 CloudFront 缓存。

默认页面 (index.jsp) 是(艺术家)搜索。假设当您输入搜索并提交搜索时,我们正在使用 direct.albunack.net,然后将搜索转到 direct.albunack.net/artist/search。 /artist 下的所有内容都映射到一个 servlet,这个 servlet 进行搜索,如果它只找到一个结果,它就会重定向到 direct.albunack.net/artist/artistid - 这使用相同的 servlet为该艺术家构建一个页面并将其返回。

如果相反,它找到多个结果,则将结果转发回 index.jsp,但会显示多个结果,如果用户随后单击其中一个结果,则会再次将其重定向到 direct.albunack.net/artist/artistid

到目前为止一切顺利,当我使用 www.albunack.net 时出现问题。 Cloudfront 默认 (*) 行为是缓存所有请求,而不是转发标头等。但是我们为 /artist/search 路径添加了另一种行为,这样它就不会缓存实际的搜索。

当它找到多个结果时,它会重定向到 http://www.albunack.net/index.jsp,然后单击其中一个选项会重定向到 http://www.albunack.net/artist/artistid

但我遇到的问题(我认为)是因为搜索委托给 direct.albunack.net 当只有一个选择时,它会重定向到 http://direct.albunack.net/artist/artistid 绕过缓存并暴露我们的直接界面。

那么我该如何编码,如果我真的硬编码包括服务器在内的完整路径,那么它在本地运行时将无法工作,什么是正确的方法。

Servlet 代码提取:

if (!Strings.isNullOrEmpty(artistName))
{
    //Look up artist for that id
    MusicBrainzSearchArtist mbArtistSearch = new MusicBrainzSearchArtist();
    List<Artist> mbArtists = mbArtistSearch.queryByArtistName(artistName);

    if (mbArtists.size() == 0)
    {
        request.setAttribute(ERROR, InfoMessage.MSG_NO_RESULTS_FOUND.getMsg(artistName));
        request.getRequestDispatcher("/index.jsp").forward(request, response);
        return;
    }
    else if (mbArtists.size() == 1)
    {
        response.sendRedirect("/artist/" + mbArtists.get(0).getId());
        return;
    }
    else
    {
        request.setAttribute(ERROR, InfoMessage.MSG_MULTIPLE_RESULTS_FOUND.getMsg(artistName));
        request.setAttribute("results", mbArtists);
        request.getRequestDispatcher("/index.jsp").forward(request, response);
        return;
    }
}

更新

我已经修改了

 response.sendRedirect("/artist/" + mbArtists.get(0).getId());

response.sendRedirect(getRedirectServePath(request) + "/artist/" + mbArtists.get(0).getId());

 public String getRedirectServerPath(HttpServletRequest request)
    {
        return "http://" + request.getServerName() + ":" + request.getServerPort();
    }

这行得通,但这似乎太老套了,我不太确定它为什么会起作用,因为我认为 request.getServerName() 会返回 direct.albunack.net 还是 www.albunack.net 因为 getServerName() 返回服务器上原始入口点的名称,但没有它,路径 /artist 将在执行重定向时解析当前服务器?

【问题讨论】:

  • 有什么理由不能进行相对重定向?例如。不指定域名?我不熟悉您使用的框架,但如果您想从多个域名访问网站(如您的情况),这是正确的方法。
  • 在原始代码中,我正在执行相对重定向而不是 i (response.sendRedirect("/artist/" + mbArtists.get(0).getId());) 并且没有按描述工作.
  • 附带说明,在您的新代码中,我绝对不会硬编码到 http。你可以使用 request.getScheme() 代替。
  • @rock-fall,非常感谢——(但我必须这样做)
  • 我认为你走在正确的道路上,从编码的角度来看没有其他选择。如果您可以指定应该缓存的 url 模式,那么您应该在云端缓存上查找一些配置,以便重定向不会落入您的直接界面。

标签: java servlets caching amazon-cloudfront


【解决方案1】:

为请求添加一些独特的东西(如 url 的时间戳),它将不再被缓存。

【讨论】:

  • 谢谢,但我认为你没有理解这个问题,问题是直接 url 被暴露了。
  • Paul Taylor,'url 被暴露'的事实在这个问题上并不是很清楚。
猜你喜欢
  • 2014-04-16
  • 1970-01-01
  • 2011-07-30
  • 2014-04-29
  • 2010-10-29
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多