Android 는 단일 도 메 인 이름 의 쿠키 를 제거 합 니 다.

오늘 PM 은 사용자 가 현재 웹 페이지 를 종료 할 때 이 웹 페이지 가 방문 한 도 메 인 이름과 관련 된 쿠키 만 삭제 하고 다른 도 메 인 이름 의 쿠키 를 유지 하 는 것 을 요구 합 니 다.
CookieManager 의 API 를 찾 아 보 니 removeAllCookie()만 있 고 단독 도 메 인 이름 쿠키 의 API 는 제거 되 지 않 았 습 니 다.생각해 보 니,이렇게 많은 해 동안 브 라 우 저 를 사 용 했 는데,언제 이 기능 을 본 적 이 있 습 니까?
시스템 이 인 터 페 이 스 를 제공 하지 않 은 이상 스스로 방법 을 강구 하여 청산 할 수 밖 에 없다.
일단 쿠키 가 어디 있 는 지 알 아야 되 는 거 죠?
/data/data//appwebview 디 렉 터 리 에서 Cookies 파일 을 찾 습 니 다.비록.db 확장자 가 없 지만 사실은 sqlite 데이터베이스 입 니 다!들 어가 보 세 요.데이터 가 안에 있 는 cookies 표 에 있 습 니 다.

sqlite> .tables
cookies meta  
sqlite> .dump cookies
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE cookies (creation_utc INTEGER NOT NULL UNIQUE PRIMARY KEY,host_key TEXT NOT NULL,name TEXT NOT NULL,value TEXT NOT NULL,path TEXT NOT NULL,expires_utc INTEGER NOT NULL,secure INTEGER NOT NULL,httponly INTEGER NOT NULL,last_access_utc INTEGER NOT NULL, has_expires INTEGER NOT NULL DEFAULT 1, persistent INTEGER NOT NULL DEFAULT 1,priority INTEGER NOT NULL DEFAULT 1,encrypted_value BLOB DEFAULT '',firstpartyonly INTEGER NOT NULL DEFAULT 0);
INSERT INTO "cookies" VALUES(13122904895970126,'.hm.baidu.com','HMACCOUNT','1E0666871DC4BB45','/',13792186776970126,0,0,13122906283432123,1,1,1,X'',0);
INSERT INTO "cookies" VALUES(13122905170226445,'.facebook.com','reg_fb_ref','https%3A%2F%2Fm.facebook.com%2F%3Frefsrc%3Dhttps%253A%252F%252Fwww.facebook.com%252F','/',0,0,1,13122905170226445,0,0,1,X'',0);
INSERT INTO "cookies" VALUES(13122905170227182,'.facebook.com','reg_fb_gate','https%3A%2F%2Fm.facebook.com%2F%3Frefsrc%3Dhttps%253A%252F%252Fwww.facebook.com%252F','/',0,0,1,13122905170227182,0,0,1,X'',0);
INSERT INTO "cookies" VALUES(13122905170227393,'.facebook.com','m_ts','1478103992','/',0,0,0,13122905170227393,0,0,1,X'',0);
INSERT INTO "cookies" VALUES(13122905172258460,'.facebook.com','datr','uxMaWFe4eAqp6W2_dDu2MpA1','/',13185977172258460,0,1,13122905172258460,1,1,1,X'',0);
INSERT INTO "cookies" VALUES(13122905172508865,'.facebook.com','fr','0EhMpmXi6717eJE6Y..BYGhO4.Dd.AAA.0.0.BYGhO7.AWUFjMmY','/',13130681172508865,0,1,13122905172508865,1,1,1,X'',0);
CREATE INDEX domain ON cookies(host_key);
CREATE INDEX is_transient ON cookies(persistent) where persistent != 1;
COMMIT;
이 안에 저 장 된 것 은 HTTP 머리 에 있 는 Set-Cookie 필드 에 포 함 된 모든 정보 입 니 다.페 이 스 북 을 예 로 들 면 다음 과 같 습 니 다.
Set-Cookie: m_ts=1478103992; datr=uxMaWFe4eAqp6W2_dDu2MpA1; fr=OEhMpmXi6717eJE6Y; path=/; domain=.facebook.com
우리 가 이 정 보 를 지우 기만 하면 웹 뷰 가 다음 에 요청 할 때 유효한 쿠키 가 없습니다.가장 직접적인 생각 은 CookieManager 의 setCookie()방법 을 사용 하여 이 필드 를 비우 거나 만 료 로 설정 하면 되 지 않 습 니까?StackOverflow 에서 검색 해 보 니 비슷 한 생각 을 토론 하 는 게시 물 을 찾 아 보 았 지만 안 되 었 습 니 다.
링크
다음은 만 났 던 구덩이 에 대해 이야기 해 보 자.
1.같은 도 메 인 이름,http 와 https 두 가지 상황 에서 쿠키 테이프 의 매개 변 수 는 다르다.예 를 들 면,http://www.facebook.com따르다https://www.facebook.com,CookieManager.getCookie()를 통 해 얻 은 인 자 는 완전히 다 릅 니 다.이 문 제 는 나 를 한 시간 넘 게 괴 롭 혔 다.왜냐하면 나 는 어떤 매개 변수 들 이 죽 어 라 깨 닫 지 못 하 는 것 을 발 견 했 기 때문이다.
2.Cookies 표 에는"."로 시작 하 는 도 메 인 이름 이 있 습 니 다.예 를 들 어 표 에 있 는".facebook.com"과 같은 도 메 인 이름 이 있 습 니 다.일부 인 자 는 완전 도 메 인 이름 으로 삭제 할 수 없습니다.겨냥 하 다http://www.facebook.comCookieManager.setCookie()를 호출 하여 필드 정 보 를 삭제 하면 표 에'www.facebook.com'의 기록 이 하나 더 있 고 원래 의'facebook.com'의 기록 이 존재 하 며 필드 정보 가 삭제 되 지 않 은 것 을 발견 할 수 있 습 니 다.
3."."로 시작 하 는 도 메 인 이름,예 를 들 어".facebook.com"을 사용 하여 CookieManager.getCookie()를 호출 할 때 전체 인자 목록 을 가 져 올 수 없습니다.
4.서로 다른 사 이 트 는 Cookies 표 에 여러 가지 기록 을 추가 합 니 다.페 이 스 북 의 경우 표 에'www.facebook.com','www.facebook.com','facebook.com'등 세 가지 기록 이 저 장 될 수 있 습 니 다.
마지막 으로 결론 을 말 하 자.우여곡절 끝 에 쓸 수 있 는 방법 을 찾 았 고 5.1/6.0 플랫폼 을 직접 측정 해서 사용 할 수 있다.사실 매우 간단 하고 난폭 하 다.바로 상기 4 조 에서 언급 한 그 몇 가지 기록 을 모두 훑 어 보 는 것 이다.차라리 천 을 잘못 죽 일 지 언 정 하 나 를 놓 치지 않 는 다.
코드 첨부(domain 매개 변 수 는 프로 토 콜 을 가 진 도 메 인 이름 입 니 다.예 를 들 어https://www.baidu.com):

private static void deleteCookiesForDomain(Context context, String domain) {
    CookieManager cookieManager = CookieManager.getInstance();
    if (cookieManager == null) return;
 
    /* http://code.google.com/p/android/issues/detail?id=19294 */
    if (Build.VERSION.SDK_INT < 11) {
      /* Trim leading '.'s */
      if (domain.startsWith(".")) domain = domain.substring(1);
    }
 
    String cookieGlob = cookieManager.getCookie(domain);
    if (cookieGlob != null) {
      String[] cookies = cookieGlob.split(";");
      for (String cookieTuple : cookies) {
        String[] cookieParts = cookieTuple.split("=");
        HashSet<String> domainSet = getDomainSet(domain);
        for (String dm : domainSet) {
          /* Set an expire time so that this field will be removed after calling sync() */
          cookieManager.setCookie(dm, cookieParts[0] + "=; Expires=Wed, 31 Dec 2015 23:59:59 GMT");
        }
      }
      cookieManager.sync();
    }
  }
 
  private static HashSet<String> getDomainSet(String domain) {
    HashSet<String> domainSet = new HashSet<>();
    String host = Uri.parse(domain).getHost();
 
    domainSet.add(host);
    domainSet.add("." + host);
    // exclude domain like "baidu.com"
    if (host.indexOf(".") != host.lastIndexOf(".")) {
      domainSet.add(host.substring(host.indexOf('.')));
    }
 
    return domainSet;
  }
이상 의 안 드 로 이 드 가 하나의 도 메 인 이름 을 지 우 는 쿠키 를 실현 하 는 것 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 저 희 를 많이 사랑 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기