我知道这个问题之前已经被问过几次,但是我的WebApp似乎没有解决方案。
此servlet处理JSP页面,用户可以(虚构地)在其上购买信用。在get-method中,servlet从数据库请求用户的当前信用,以在JSP页面上显示它们。然后用户可以选择他想要购买的信用额度。
post方法检查用户选择的值,并更新该用户的数据库中的值。
购买新的积分后,它会查找用户,因为他的积分未更新,因为浏览器(谷歌浏览器)缓存旧版本的页面。只有一段时间后,用户才能看到他的更新信用。
这是我的servlet:
<!-- language: lang-java -->
package Controller.Servlets;
import Controller.ListenerHelper;
import Model.Listener;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
*
* @author Jens
*/
public class CreditServlet extends HttpServlet {
private Listener listener;
private int credits;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
ListenerHelper listenerHelper = new ListenerHelper();
listener = (Listener) session.getAttribute("Listener");
credits = listener.getCredits();
request.setAttribute("credits", credits);
request.getRequestDispatcher("/listener/credits.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
listener = (Listener) session.getAttribute("Listener");
String choice = request.getParameter("plan");
ListenerHelper listenerHelper = new ListenerHelper();
int creditsToAdd=0;
switch (choice){
case "plan_10":
creditsToAdd=100;
break;
case "plan_15":
creditsToAdd=150;
break;
case "plan_25":
creditsToAdd=250;
break;
case "plan_50":
creditsToAdd=500;
break;
}
try{
listenerHelper.updateCredits(listener.getUserID(), creditsToAdd, "add");
} catch(Exception e){
request.setAttribute("error", e.getMessage());
}
httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0
httpResponse.setDateHeader("Expires", 0); // Proxies.
response.sendRedirect("store.jsp?success=login");
}
}
在JSP页面的顶部,我添加了这些行:
<%
response.setHeader("Cache-Control","no-store"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
%>
更新 由于我无法回答我自己的问题,我只会更新我的问题。经过一些调试后我发现它不是浏览器缓存旧结果,而是数据库只在重新启动Web应用程序后更新结果。我很抱歉浪费你的时间。我还是编程新手。我将尝试找出数据库为何如此行事并发布我的答案。谢谢你的帮助。
答案 0 :(得分:1)
请注意,在servlet中,在重定向之前,您要设置:
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
然后在重定向后的JSP中:
response.setHeader("Cache-Control","no-store"); //HTTP 1.1
为什么你没有使用更强大的标头? “no-cache,no-store,must-revalidate”发生了什么?
重定向之前设置的内容就会消失。好像你甚至没有做到这一点。只有在重定向发送到客户端后您正在设置的内容。所以你需要像在servlet中那样在JSP中放置更多的标头。
答案 1 :(得分:0)
每次尝试使用不同的URL,以便每次从浏览器进行新的调用。
这个技巧将强制浏览器获取JSP的新副本,因为URL已被更改。
response.sendRedirect("store.jsp?success=login&random_uuid");
您可以使用UUID
UUID.randomUUID().toString()