2012-06-19 31 views
5

i đã viết mã tiếp theo:xóa cookie bằng 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(); 
} 

vấn đề là tiếp theo: khi tôi xóa cookie từ cookielist, làm thế nào tôi có thể đặt cookielist cập nhật (không có cookie sẽ bị xóa) trở lại khách hàng? yêu cầu hoặc phản hồi không có bất kỳ phương thức *.setCookies(); nào. hoặc cookie sẽ tự động cập nhật? Trân trọng.

+0

Bạn đã thử đặt nó vào tiêu đề HTTP của mình chưa? – jocelyn

+0

@jocelyn nope, tôi thì không. –

Trả lời

14

Bạn cần đặt cùng một cookie với giá trị null và độ tuổi tối đa là 0 (và cùng một đường dẫn, nếu bạn đã đặt một tùy chỉnh) trả về phản hồi theo HttpServletResponse#addCookie().

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

Không liên quan cho vấn đề cụ thể, bạn không cần phải xoa bóp mảng vào một danh sách và trở lại ở tất cả. Việc tăng cường cho vòng lặp hoạt động trên mảng là tốt. Ngoài ra, việc sử dụng == để so sánh Long giá trị sẽ chỉ hoạt động đối với các giá trị từ -128 đến 127. Thay vào đó, bạn cần equals(). Vì vậy, tất cả trong tất cả, phương pháp này có thể trông như thế này:

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); 
      } 
     } 
    } 
} 

Bằng cách này, nó là đáng sợ để xem requestresponse là biến thể hiện của một số lớp. Bạn có chắc chắn rằng lớp học cụ thể là luồng an toàn không? Để hiểu servlets và threadsafety, bạn có thể thấy câu trả lời này hữu ích: How do servlets work? Instantiation, sessions, shared variables and multithreading.

+1

@ BalusC vì vậy tôi không cần phải gọi phương thức request.getCookies() và thực hiện nó thông qua phương thức WebUtils.getCookie? –

+0

Tôi không biết phương thức 'WebUtils.getCookie' là gì. Có lẽ đó là từ một khuôn khổ bên thứ 3 tôi không quen thuộc với nhưng bạn không nói bất cứ điều gì về trong câu hỏi của bạn. Tôi chỉ giả định tiêu chuẩn Java EE ngăn xếp như câu hỏi của bạn đã không đưa ra bất kỳ dấu hiệu của một khuôn khổ bên thứ 3. – BalusC

+1

@ BalusC, tôi không biết tính năng đó về các giá trị Long. tôi sẽ sửa chữa nó. thnx. –

Các vấn đề liên quan