2013-02-03 3 views
1

다음 함수를 사용하여 Java Servlet에 설정된 쿠키를 만듭니다. .JSP 파일의 스크립틀릿에서 삭제하려고합니다. 그러나 쿠키를 삭제하지 않는 이유는 무엇입니까?.JSP 파일에서 Java 쿠키 삭제

Cookie[] cookies = null; 
     cookies = request.getCookies(); 
     if(cookies != null){ 
      for(int i = 0; i < cookies.length; i++){ 
       Cookie cookie = cookies[i]; 
       if(cookie.getName().equals("componentSearchOptionSelect")){ 

        selectedClass = cookie.getValue(); 
        cookie.setMaxAge(0); 
        response.addCookie(cookie); 
       } 
      } 
     } 

답변

1

JSP는 뷰 기술로서 HTTP 응답 본문을 생성합니다. 쿠키는 HTTP 응답 헤더에 있어야합니다. 그래서 쿠키 코드를 JSP에 중간에 넣으면 JSP가 이미 그 시점에서 응답이 이미 커밋 된 많은 HTML을 만들어 냈습니다. HTTP 응답 헤더를 설정하기에는 너무 늦었습니다. HTTP 응답 헤더가 이미 클라이언트에 전송되었으므로 반환하지 않습니다. 서버 로그에주의를 기울 였다면 메시지와 추적을 알기 쉽게 설명한 IllegalStateException을 알아야합니다.

따라서 문제를 해결하려면 응답이 아직 커밋되지 않은 경우 쿠키를 삭제하십시오. JSP가 HTTP 응답 본문에 아무 것도 쓰지 않기 훨씬 전에 JSP 페이지 맨 위에 모든 비즈니스 로직을 포함하는 스크립틀릿을 넣으십시오.

<% 
    // Business logic here. 
%> 
<!DOCTYPE html> 
<html> 
    ... (presentation logic here) 
</html> 

사실, JSP는 비즈니스 로직을 수행 할 수있는 잘못된 장소 (읽기 : you should not be using scriptlets at all을). 이 경우 servlet 또는 servlet filter을 사용해야합니다. 귀하의 특별한 경우에는 doGet()으로 서블릿이 필요하다고 생각합니다.

0

하십시오

for(String classId :request.getParameterValues("classId")){ 
     optionCookie = new Cookie("componentSearchOptionSelect",classId); 
     response.addCookie(optionCookie); 
    } 

이 내가 스크립틀릿에서 쿠키를 삭제 사용하고있는 코드는 다음과 같습니다

내가 서블릿에서 쿠키를 만드는 데 사용하고있는 기능입니다 이 시도.

/* 
Cookie[] cookies = null; 
cookies = request.getCookies(); 
if(cookies != null){ 
    for(int i = 0; i < cookies.length; i++){ 
     Cookie cookie = cookies[i]; 
     if(cookie.getName().equals("componentSearchOptionSelect")){ 
      selectedClass = cookie.getValue(); 
      cookie.setMaxAge(0); 
      response.addCookie(cookie); 
     } 
    } 
} 
*/ 

Cookie cookie = new Cookie("componentSearchOptionSelect", ""); 
cookie.setMaxAge(0); 
response.addCookie(cookie); 

그런데 왜 같은 값을 Cookie 번으로 설정합니까? 쿠키 componentSearchOptionSelect의 값은 마지막 값인 request.getParameterValues("classId"))입니다.

+0

'for' 루프는 배열에 하나의 필드만을 가지고 있습니다. 이것은 나중에 살펴볼 것이지만 지금은 작동합니다. 코드가 실행 된 후 솔루션이 작동하지 않았습니다.'setMaxAge'가'-1'로 유지됩니다. – Colin747

+0

어떻게 그 값을 확인 했습니까? 브라우저 또는 한 번 더 JSP에서? – koji

+0

다음 코드를 사용했습니다 : 쿠키 [] cookies2 = null; \t \t \t 쿠키 2 = request.getCookies(); \t \t \t 는 (! cookies2 = NULL) {위한 \t \t \t \t는 (; 나는 cookies2.length를 <; I = 0 int로 난 ++) 경우에 { \t \t \t \t \t 쿠키 Cookie2는 = 쿠키 [I]; \t \t \t \t \t (cookie2.getName(). 등호 ("componentSearchOptionSelect")) { \t \t \t \t \t \t에서 System.out.println (Cookie2는 경우.getMaxAge()); \t \t \t \t \t} \t \t \t \t} \t \t \t}'예를 들어 – Colin747