簡體   English   中英

禁用servlet中的瀏覽器緩存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM