【发布时间】:2014-05-14 18:45:27
【问题描述】:
我知道这个问题之前已经被问过并回答了好几次,但该解决方案似乎不适用于我的 WebApp。
这个 servlet 处理一个 JSP 页面,用户可以(假想地)在该页面上购买积分。在 get 方法中,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 应用程序后才更新结果。很抱歉在这件事上浪费了您的时间。我还是编程新手。我将尝试找出数据库为什么会这样并发布我的答案。感谢您的帮助。
【问题讨论】: