6

我写了下一个代码:

public void delete(MyType instance) {
        List<MyType> myList = this.getAll();

        Cookie[] cookies = request.getCookies();
        List<Cookie> cookieList = new ArrayList<Cookie>();
        cookieList = Arrays.asList(cookies);
        for(Cookie cookie:cookieList) {
            if(Long.valueOf(cookie.getValue()) == instance.getId()) {
                cookieList.remove(cookie);
            }
        }
        myList.remove(instance);
        cookies = (Cookie[]) cookieList.toArray();
}

下一个问题是:当我从 cookielist 中删除 cookie 时,如何将更新的 cookielist(没有删除的 cookie)放回客户端?request 或 response 没有任何*.setCookies();方法。还是cookies会自动更新?此致。

4

1 回答 1

17

您需要在null响应0中通过HttpServletResponse#addCookie().

cookie.setValue(null);
cookie.setMaxAge(0);
cookie.setPath(theSamePathAsYouUsedBeforeIfAny);
response.addCookie(cookie);

与具体问题无关,您根本不需要将数组按摩到列表并返回。增强的 for 循环同样适用于数组。此外,==用于比较Long值仅适用于 -128 和 127 之间的值。您需要equals()。总而言之,该方法可能如下所示:

public void delete(MyType instance) {
    Cookie[] cookies = request.getCookies();

    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (Long.valueOf(cookie.getValue()).equals(instance.getId())) {
                cookie.setValue(null);
                cookie.setMaxAge(0);
                cookie.setPath(theSamePathAsYouUsedBeforeIfAny);
                response.addCookie(cookie);
            }
        }
    }
}

顺便说一句,看到requestresponse成为某个类的实例变量是很可怕的。您确定特定类是线程安全的吗?要了解 servlet 和线程安全,您可能会发现这个答案很有帮助:servlet 如何工作?实例化、会话、共享变量和多线程

于 2012-06-19T14:23:22.243 回答