我知道这个问题之前曾被问过并回答过几次,但是该解决方案似乎在我的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应用程序后才更新结果。 很抱歉浪费您的时间。 我还是编程新手。 我将尝试找出为什么数据库会这样,然后发布我的答案。 谢谢你的帮助。

#1楼 票数:1

请注意,在servlet中,在重定向之前,您需要进行以下设置:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");

然后在重定向后的JSP中只是:

response.setHeader("Cache-Control","no-store"); //HTTP 1.1

为什么不使用更强大的标头呢? “没有缓存,没有存储,必须重新验证”发生了什么?

您在重定向之前设置的内容只会消失。 好像您甚至都没有做。 仅将您在重定向后设置的内容发送到客户端。 因此,您需要像在servlet中一样将更具持久性的标头放入JSP。

#2楼 票数:0

始终尝试使用其他URL,以使其每次都从浏览器发出新呼叫。

该技巧将迫使浏览器获取JSP的新副本,因为URL已更改。

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

您可以使用UUID生成唯一的ID

UUID.randomUUID().toString()

  ask by DaanCelie translate from so

未解决问题?本站智能推荐:

2回复

如何清除servlet中的浏览器缓存?

当我单击注销按钮时,我希望清除浏览器缓存。 我正在尝试使用以下代码清除浏览器缓存: 注销后在浏览器窗口中按返回按钮时,我需要浏览器不显示上一页。 当我单击后退按钮时,它显示上一页,在浏览器窗口中单击前进按钮后,它显示document expired 。 请给我建议以清除
3回复

在浏览器中获取servlet的结果

这个问题可能已经问了好几次了,也可能已经回答了。我已经花了相当长的时间寻找答案,但还没有找到答案。 让我们从头开始。 我在Java文件夹C:\\ Program Files \\ java \\中的程序文​​件中的c:驱动器上安装了jdk 8 我在C:\\ Program File
1回复

在Servlet中强制浏览器下载-Spring

我是Spring MVC的新手,我对访问servlet中的HttpServletResponse对象有疑问。 基本上我的代码是这样的: 现在,此json文件正在作为响应显示在浏览器上。 无论浏览器如何,我都必须强制将其下载到用户的磁盘。 通过查看其他帖子,我认为我应该这样做:
3回复

在浏览器中禁用后退按钮

这个问题已经在这里有了答案: 禁用浏览器的后退按钮 20个答案 登录页面出现时,我有一项禁用后退按钮的要求。 注意以下代码不起作用。 对于服务器端,我还添加了一些服务器端代码,如下所示。
1回复

无法使用servlet和jsp在浏览器中打开PDF文件

我正在尝试使用servlet和jsp在浏览器窗口中打开pdf文件。 通过单击jsp的按钮,我正在调用servlet,然后通过该servlet尝试在浏览器上显示pdf文件。 这是我正在尝试的代码: jsp文件: doPost方法中的servlet部分: 请让我知道我在
1回复

使用jsp / servlet在浏览器中显示动态html页面

我想使用JSP / Servlet动态显示html文件(最后修改在顶部)。 请帮我 。
3回复

如何防止某人从JSP / Servlet中的浏览器修改输入表单参数

请考虑以下情形: 我有一个HTML表单。 我正在读取用户在我的servlet之一中提供的输入: 现在,我不需要进行空检查,因为我知道该值不会为空。 该值可以是1或2,因此它将被成功解析为int。 但是,任何主体都可以将radioButton的值更改为其他值(例如,通过使
4回复

浏览器显示来自Servlet的HTML代码

看到了许多类似的问题,但是没有找到决定。 问题 :浏览器显示servlet的代码,而不是执行此servlet。 这是index.jsp 这是LoginServlet web.xml中 我将不胜感激任何帮助。