【问题标题】:Disable browser caching in servlet在 servlet 中禁用浏览器缓存
【发布时间】: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 应用程序后才更新结果。很抱歉在这件事上浪费了您的时间。我还是编程新手。我将尝试找出数据库为什么会这样并发布我的答案。感谢您的帮助。

【问题讨论】:

标签: java jsp servlets


【解决方案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 中放置更持久的标头。

【讨论】:

  • 感谢您的帮助。我首先添加了 httpResponse.setHeader,但它不起作用,所以我将 response.setHeader 添加到 JSP。那也不起作用,所以我更改了一些值,但没有结果。 setHeaders 只是反复试验。
  • 或者更好的是,只需将此响应标头添加到 servlet 过滤器中即可。
【解决方案2】:

始终尝试使用不同的 URL,以便每次从浏览器调用它。

此技巧将强制浏览器获取 JSP 的新副本,因为 URL 已更改。

response.sendRedirect("store.jsp?success=login&random_uuid");

您可以使用UUID生成唯一ID

UUID.randomUUID().toString()

【讨论】:

  • 你试过response.setDateHeader("Expires", -1);
  • 感谢您的帮助。我在重定向中添加了一个 random_uuid,但缓存仍然可以正常工作。不应该将random_uuid添加到doget方法的requestdispatcher中来创建唯一的jsp页面吗?无论如何,我也尝试过,但也没有用。 request.getRequestDispatcher("/listener/credits.jsp?random_uuid").forward(request, response);
  • 这里random_uuid 必须是某个值,而不仅仅是字符串“random_uuid”
  • 我分享了一种生成随机值的方法。应该是response.sendRedirect("store.jsp?success=login&amp;"+UUID.randomUUID().toString());
  • 我已经更新了我的问题。不管怎样,你的信息还是有用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 2018-08-30
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 2018-06-29
  • 2011-07-25
相关资源
最近更新 更多