[英]Disable browser caching in servlet
我知道這個問題之前曾被問過並回答過幾次,但是該解決方案似乎在我的WebApp中不起作用。
該Servlet處理一個JSP頁面,用戶可以在該頁面上(虛擬地)購買信用。 在get方法中,servlet從數據庫請求用戶的當前信用,以在JSP頁面上顯示它們。 然后,用戶可以選擇他想購買的信用額度。
post方法檢查用戶選擇了哪個值,並為該用戶更新數據庫中的值。
購買新的抵免額后,由於瀏覽器(Google Chrome)緩存了該頁面的舊版本,因此用戶看上去好像抵免額未更新。 只有一段時間后,用戶才能看到他的更新積分。
這是我的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應用程序后才更新結果。 很抱歉浪費您的時間。 我還是編程新手。 我將嘗試找出為什么數據庫會這樣,然后發布我的答案。 謝謝你的幫助。
請注意,在servlet中,在重定向之前,您需要進行以下設置:
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
然后在重定向后的JSP中只是:
response.setHeader("Cache-Control","no-store"); //HTTP 1.1
為什么不使用更強大的標頭呢? “沒有緩存,沒有存儲,必須重新驗證”發生了什么?
您在重定向之前設置的內容只會消失。 好像您甚至都沒有做。 僅將您在重定向后設置的內容發送到客戶端。 因此,您需要像在servlet中一樣將更具持久性的標頭放入JSP。
始終嘗試使用其他URL,以使其每次都從瀏覽器發出新呼叫。
該技巧將迫使瀏覽器獲取JSP的新副本,因為URL已更改。
response.sendRedirect("store.jsp?success=login&random_uuid");
您可以使用UUID
生成唯一的ID
UUID.randomUUID().toString()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.