我如何编写我的servlet代码,以便它与Cloudfront Cache很好地协作

Pau*_*lor 15 java caching servlets amazon-cloudfront

我的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默认(*)行为是缓存所有请求,而不是转发标头ectera.但是我们为/ 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

更新

我修改过

 response.sendRedirect("/artist/" + mbArtists.get(0).getId());
Run Code Online (Sandbox Code Playgroud)

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

 public String getRedirectServerPath(HttpServletRequest request)
    {
        return "http://" + request.getServerName() + ":" + request.getServerPort();
    }
Run Code Online (Sandbox Code Playgroud)

这是有效的,但这似乎是如此hacky,我不确定为什么它的工作,因为我认为request.getServerName()将返回direct.albunack.net或它是www.albunack.net因为getServerName()返回的名称原始入口点到服务器上但没有它,路径/艺术家将在进行重定向时解析当前服务器?

Ale*_*lex 2

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