2012-04-23 3 views
1

나는 Indy TIdHTTP와 함께 TIdCookieManager을 사용하고 있습니다. 내가 보내려는 요청에 대한 현재 쿠키를 확인하고 유효 할 가능성을 확인하고 싶습니다 (서버가 요청을 수락 할 수 있는지 100 % 확신 할 수 없음). 쿠키가 없거나 쿠키가 만료 된 경우 먼저 로그인하여 새 쿠키를 얻으려고합니다. 그렇지 않으면 요청을 보냅니다.TIdHTTP : 요청을 보내기 전에 유효한 쿠키를 확인 하시겠습니까?

어떻게 확인하나요? 요청을 보내기 전에 쿠키 관리자를 확인해야하지만 무엇을 확인해야할지 모릅니다.

+0

실제 페이지를 요청하고 콘텐츠가 인증되지 않은 웹 페이지 또는 일부 오류 메시지와 일치하는지 확인해야합니다. 그것이 서버가 쿠키를 수락하는 유일한 방법입니다.) – opc0de

+0

쿠키의 유효성을 검사 할 수 없습니다. 이는 서버의 작업/책임입니다. 쿠키가 암호화되어 쓸모 없게 될 수 있습니다 ... – whosrdaddy

+1

아니요,하지만 적어도 쿠키가 만료되었는지 확인할 수 있습니다. 요청을 보내려는 URL에 대한 쿠키 목록을 'TIdCookieManager'에 요청하고 실제로 목록에 쿠키가 포함되어 있는지 확인할 수 있습니다. –

답변

2

시도 뭔가 :

function CheckCookies(Cookies: TIdCookieManager; const TargetURL: String): Boolean; 
var 
    URL: TIdURI; 
    Headers: TIdHeaderList; 
begin 
    Result := False; 

    URL := TIdURI.Create(TargetURL); 
    try 
    Headers := TIdHeaderList.Create(QuoteHTTP); 
    try 
     Cookies.GenerateClientCookies(URL, False, Headers); 
     Result := Headers.Count > 0; 
    finally 
     Headers.Free; 
    end; 
    finally 
    URL.Free; 
    end; 
end; 

.

if not CheckCookies(IdHTTP1.CookieManager, 'http://www.someurl.com/') then 
begin 
    // login and get new cookies ... 
end; 
+0

아직 시도하지는 않았지만'CheckCookies()'가 아닌'CheckCookies()'가 아닌가? 또는 실제로 실제로 의도 된 용도에 따라 달라 지므로 두 이벤트를 모두 처리하려고합니다. –

+0

나는 다시 로그인하여 새 쿠키를 얻을 수있는 부분이 '...'라고 가정했다. 그에 따라 내 대답을 업데이트했습니다. –

1

댓글에서 이미 언급 한 것처럼 클라이언트에서 실제 수락 확인을 수행 할 수 없으며 서버 만이를 수행 할 수 있습니다. 당신은 필터링 할 수 있습니다 그러나

만료 또는 무효 쿠키 :

function filterInvalidCookies(cookies: TIdCookies; targetURL: TIdURI): Boolean; 
var 
    c: Integer; 
begin 
    Result := False; 

    c := 0; 
    while (cookies.Count > c) do 
    if (not cookies[c].IsExpired and cookies[c].IsAllowed(targetURL, False) and 
     (cookies[c].CookieName <> '')) then 
     begin 
     Result := True; 
     Inc(c); 
     end 
    else 
     cookies.Delete(c); 
end; 

기능이 유효 쿠키를 제거하고 남아있는 유효한 사람이없는 경우 False를 반환합니다. 이 같은 요청하기 전에 전화 :

if (Assigned(con.CookieManager)) then 
    filterInvalidCookies(con.CookieManager.CookieCollection, 
    TIdURI.Create('http://www.someurl.com/')); 

conTIdHTTP 객체입니다.

코스를 추가로 타겟팅 할 수 있습니다. 이 같은

+2

만료 된 쿠키를 제거하는 쉬운 방법이 있습니다. 'TIdCookieManager.GenerateClientCookies()'메소드를 호출하십시오. 만료 된 쿠키를 삭제 한 다음 일치하는 리 마케팅 쿠키로 출력 목록을 채 웁니다. 'TIdCookieManager'의 향후 버전에서는 이미 쿠키 관리를보다 잘 제어 할 수있는 몇 가지 새로운 메소드 ('RemoveExcessCookies()','RemoveExpiredCookies()'및'RemoveNonPersistentCookies()')가있을 예정입니다. –

+0

좋은 해결책 인 것처럼 보이지만 필요한 것은 특정 쿠키가 존재하고 그것이 만료되지 않았는지 확인하는 것입니다. 반드시 도움이 될 것이라고 확신하지만 삭제할 필요는 없습니다. –

관련 문제