1

我正在使用以下函数来创建在 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);
                 }
             }
        }
4

2 回答 2

1

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 是执行业务逻辑的错误场所(请阅读:您根本不应该使用scriptlet)。您应该为此使用servletservlet 过滤器。在您的特定情况下,我认为您只需要一个带有doGet().

于 2013-02-04T00:28:27.113 回答
0

请试试这个。

/*
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多次设置相同的值?cookiecomponentSearchOptionSelect的值是最后一个 from 的值request.getParameterValues("classId"))

于 2013-02-04T00:05:04.127 回答