使用java删除cookie

Joh*_*ith 5 java cookies servlets

我写了下一个代码:

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();
}
Run Code Online (Sandbox Code Playgroud)

问题是下一个:当我从cookielist中删除cookie时,我如何将更新的cookielist(没有删除的cookie)放回客户端?请求或响应没有任何*.setCookies();方法.或cookie会自动更新?最好的祝福.

Bal*_*usC 15

您需要设置一个相同的cookie,其null值和最大年龄0(以及相同的路径,如果您已设置自定义路径)返回响应HttpServletResponse#addCookie().

cookie.setValue(null);
cookie.setMaxAge(0);
cookie.setPath(theSamePathAsYouUsedBeforeIfAny);
response.addCookie(cookie);
Run Code Online (Sandbox Code Playgroud)

与具体问题无关,您不需要将数组按到列表中并返回.增强的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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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