【问题标题】:Deleting Java cookie in .JSP file删除 .JSP 文件中的 Java cookie
【发布时间】:2013-01-18 16:19:16
【问题描述】:

我正在使用以下函数来创建一个在 Java Servlet 中设置的 cookie。我试图在 .JSP 文件的脚本中删除它。但是它并没有删除 cookie,有什么想法吗?

这是我用来在 Servlet 中创建 cookie 的函数:

    for(String classId :request.getParameterValues("classId")){
        optionCookie = new Cookie("componentSearchOptionSelect",classId);
        response.addCookie(optionCookie);
    }

这是我用来删除 scriptlet 中 cookie 的代码:

Cookie[] cookies = null;
        cookies = request.getCookies();
        if(cookies != null){
            for(int i = 0; i < cookies.length; i++){
                 Cookie cookie = cookies[i];
                 if(cookie.getName().equals("componentSearchOptionSelect")){

                     selectedClass = cookie.getValue();
                     cookie.setMaxAge(0);
                     response.addCookie(cookie);
                 }
             }
        }

【问题讨论】:

    标签: java jsp servlets cookies scriptlet


    【解决方案1】:

    请试试这个。

    /*
    Cookie[] cookies = null;
    cookies = request.getCookies();
    if(cookies != null){
        for(int i = 0; i < cookies.length; i++){
             Cookie cookie = cookies[i];
             if(cookie.getName().equals("componentSearchOptionSelect")){
                 selectedClass = cookie.getValue();
                 cookie.setMaxAge(0);
                 response.addCookie(cookie);
             }
         }
    }
    */
    
    Cookie cookie = new Cookie("componentSearchOptionSelect", "");
    cookie.setMaxAge(0);
    response.addCookie(cookie);
    

    顺便问一下,为什么你多次为Cookie设置相同的值? cookie componentSearchOptionSelect 的值是来自request.getParameterValues("classId")) 的最后一个值。

    【讨论】:

    • for 循环在数组中只有一个字段,这是我稍后会讨论的问题,但现在它可以工作。您的解决方案不起作用,在您的代码运行后,setMaxAge 仍为-1
    • 你是如何检查那个值的?来自浏览器还是 JSP?
    • 我使用了以下代码:Cookie[] cookies2 = null; cookies2 = request.getCookies(); if(cookies2 != null){ for(int i = 0; i &lt; cookies2.length; i++){ Cookie cookie2 = cookies[i]; if(cookie2.getName().equals("componentSearchOptionSelect")){ System.out.println(cookie2.getMaxAge()); } } }
    • 比如你是不是在同一个jsp中删除和检查Cookie?这当然是 Cookie 尚未从浏览器中删除。因为您的操作(删除)尚未提供给浏览器。 a.jsp -> 删除 Cookie 并显示 HTML。 b.jsp -> 检查 Cookie。你可以做?也许你可以在浏览器上观看 Cookie。但也许浏览器没有向 b.jsp 提供该 Cookie。
    • 问题是当我刷新同一个 .JSP 页面时 cookie 仍然存在,即使它应该在页面刷新之前被删除。它可以在浏览器开发工具 (Chrome) 中看到,因为它还设置了我选择的下拉选项。
    【解决方案2】:

    JSP 作为一种视图技术,负责生成 HTTP 响应体。 Cookie 必须放在 HTTP 响应标头中。因此,如果您将该 cookie 代码放在 JSP 中的一半,并且 JSP 已经生成了导致响应已经提交的大量 HTML,那么设置 HTTP 响应标头就为时已晚。 HTTP 响应标头已经发送到客户端,这是一个不归路。如果您注意过服务器日志,那么您应该已经注意到 IllegalStateException 带有非常不言自明的消息和跟踪。

    因此,要解决您的问题,只需确保在响应尚未提交时删除 cookie。将包含所有业务逻辑的 scriptlet 放在 JSP 页面的最顶部,早在 JSP 将任何内容写入 HTTP 响应正文之前。

    <%
        // Business logic here.
    %>
    <!DOCTYPE html>
    <html>
        ... (presentation logic here)
    </html>
    

    实际上,JSP 是执行业务逻辑的错误地方(阅读:you should not be using scriptlets at all)。您应该为此使用servletservlet filter。在您的特定情况下,我认为您只需要一个带有 doGet() 的 servlet。

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 2013-02-25
      • 2013-07-22
      • 1970-01-01
      • 2012-02-13
      • 2012-06-21
      • 1970-01-01
      • 2010-10-27
      • 2015-07-02
      相关资源
      最近更新 更多