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如何工作?实例化,会话,共享变量和多线程.