gpt4 book ai didi

java - 我如何编写我的 servlet 以便它与 Cloudfront Cache 一起很好地工作

转载 作者:太空狗 更新时间:2023-10-29 22:58:31 24 4
gpt4 key购买 nike

我的 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 默认 (*) 行为是缓存所有请求,而不是转发 header 等等。但是我们为 /artist/search 路径添加了另一种行为,这样它就不会缓存实际的搜索。

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

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

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

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

最佳答案

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

关于java - 我如何编写我的 servlet 以便它与 Cloudfront Cache 一起很好地工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29541962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com