2012-06-19 2 views
5

я написал следующий код:удаление куки с помощью Java

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, как я могу поставить обновленную cookielist (без удаленных куков) назад клиент? запрос или ответ не имеют методов *.setCookies();. или файлы cookie будут обновляться автоматически? С уважением.

+0

Вы пытались поместить его в своих HTTP-HEADERS? – jocelyn

+0

@jocelyn nope, я этого не сделал. –

ответ

14

Вы должны установить то же кук со значением null и максимальным возрастом 0 (и тем же путем, если вы установили обычай один) обратно на ответ по HttpServletResponse#addCookie().

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

Unrelated к конкретной проблеме, вам не нужно массировать массив в список и обратно на всех. Улучшенный для цикла работает на массивах как хороший. Кроме того, использование == для сравнения значений 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); 
      } 
     } 
    } 
} 

Кстати, это страшно видеть request и response, являющегося переменным экземпляр некоторого класса. Вы уверены, что конкретный класс является потокобезопасным? Чтобы понять сервлеты и безопасность потоков, вы можете найти ответ полезным: How do servlets work? Instantiation, sessions, shared variables and multithreading.

+1

@ BalusC, поэтому мне не нужно вызывать метод request.getCookies() и делать это с помощью метода WebUtils.getCookie? –

+0

Я понятия не имею, что такое метод WebUtils.getCookie. Возможно, это из сторонней структуры, с которой я не знаком, но о которой вы ничего не говорили в своем вопросе. Я просто предположил стандартный стек Java EE, так как ваш вопрос не дал никаких указаний на стороннюю структуру. – BalusC

+1

@ BalusC, я не знал этой функции о длинных значениях. я исправлю это. Thnx. –

Смежные вопросы