如何对我的 servlet 进行编码,使其与 Cloudfront Cache 很好地配合使用

2022-09-03 16:10:02

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

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

相反,如果它找到多个结果,它会将结果转发回索引.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;
    }
}

更新

Ive Modified

 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将在执行重定向时解析当前服务器?


答案 1

向请求添加一些独特的内容(例如URL的时间戳),它将不再被缓存。


答案 2