【发布时间】: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