我的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 < /strong>.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();
}
并且这有效,但这看起来有点hacky并且我不确定它为什么工作,因为我认为request.getServerName()将返回direct.albunack.net或者它是www.albunack.net因为getServerName()返回进入服务器的原始入口点的名称但没有它,路径/艺术家将在进行重定向时解析当前服务器?
答案 0 :(得分:2)
为请求添加一些独特的内容(如时间戳到网址),它将不会再缓存。