Okhttp를 사용하여 쿠키 지속

7021 단어 android
전언
의존성:
compile ‘com.squareup.okhttp3:okhttp:3.10.0’
간단한 사용 방법에 대해서는 군말하지 않겠습니다. 일반적인 항목에서는 로그인을 하고 대응하는 인터페이스의 데이터를 얻어야 합니다. 로그인 후 쿠키를 유지하고 나머지 인터페이스 정보를 방문하는 기능을 중심으로
새 HttpClient
            OkHttpClient httpClient = new OkHttpClient.Builder()
                        .cookieJar(new CookieJar() {

                            //   
                            private final HashMap> cookieStore = new HashMap>();

                            //  
                            @Override
                            public void saveFromResponse(HttpUrl url, List cookies) {
                                cookieStore.put(url,cookies);
                            }

                            //  
                            @Override
                            public List loadForRequest(HttpUrl url) {
                                List cookies = cookieStore.get(url);
                                return cookies != null ? cookies : new ArrayList();
                            }
                        }).build();

Cookie란 키 값 쌍을 저장하는 것으로 간단하게 이해할 수 있습니다. 키 = value는 HashMap을 만들어서 url을 키로 저장하고 대응하는 url 서버가 우리의 쿠키 그룹에 되돌려줍니다.
하나의 쿠키는 한 쌍의 값입니다. 서버는 우리에게 여러 개의 쿠키를 되돌려줄 수 있습니다. 예를 들어 다음과 같습니다.
name = Tom 쿠키
age = 13 다른 쿠키
saveFrom Response(Http Url url, List cookies)는 서버에서 되돌아오는 Response에서 되돌아오는 Cookies(여러 개일 수 있음)를 가져오는 데 사용되며, cookie Store라는 변수에 저장됩니다.
loadForRequest (HttpUrl url) 는 url 이 키에 따라 쿠키 스토어에서 대응하는 모든 쿠키를 가져오는 데 사용됩니다
로그인 코드
                //  Form  
                FormBody loginBody = new FormBody.Builder()
                        .add("username","admin")
                        .add("password","admin")
                        .build();

                //    
                final Request loginRequest = new Request.Builder()
                        .url("http://192.168.1.21:8080/manage/user/login.do")
                        .post(loginBody)
                        .build();

                //      
                okhttp3.Call loginCall = httpClient.newCall(loginRequest);
                try {
                    okhttp3.Response loginResponse = loginCall.execute();
                    String loginResutl = loginResponse.body().string();
                    //isSuccessFul              

                    //       Response      Cookie
                    Headers loginHeaders = loginResponse.headers();
                    HttpUrl loginUrl = loginRequest.url();
                    List cookies = Cookie.parseAll(loginUrl,loginHeaders);
                    if(cookies!=null){
                        //      Url      Cookie  Cookiejar      cookieStore  ,             url      cookie
                        httpClient.cookieJar().saveFromResponse(loginUrl,cookies);
                    }

                    Log.d(TAG,loginResutl);
                } catch (IOException e) {
                    e.printStackTrace();
                }

로그인 성공 후 다른 인터페이스 액세스

                //  cookieStore       url   cookie,   key = value       
                StringBuilder cookieStr = new StringBuilder();
                List cookies = httpClient.cookieJar().loadForRequest(loginRequest.url());
                for(Cookie cookie : cookies){
                    cookieStr.append(cookie.name()).append("=").append(cookie.value());
                }

                //               
                FormBody contentBody = new FormBody.Builder()
                        .add("productId","29")
                        .build();
                // cookie         
                Request contentRequest = new Request.Builder()
                        .url("http://192.168.1.21:8080/manage/product/detail.do")
                        .header("Cookie",cookieStr.toString())
                        .post(contentBody)
                        .build();


                okhttp3.Call contentCall = httpClient.newCall(contentRequest);
                try {
                    okhttp3.Response contentResponse = contentCall.execute();
                    String contentResult = contentResponse.body().string();
                    Log.d(TAG,contentResult);
                } catch (IOException e) {
                    e.printStackTrace();
                }

쿠키는 지속적인 메커니즘으로
우선, 쿠키는 클라이언트에 저장되고 브라우저에 저장된다고 할 수 있다. Session은 서버에 저장된다. 우리가 타오바오에 로그인하면 타오바오의 모든 사이트를 방문할 수 있지 않겠는가. 한 페이지를 방문하면 한 번 로그인해야 하는 것이 아니라 이것이 바로 Session과 쿠키가 작용하는 것이다.

    - - - - - - >    (          Session)

    SessionID  - - -    (              session               )

    SeesionId    Cookie ,             ,          Session

소결
위의 코드 로직에서 볼 때 관건은 로그인 성공 후 서버에서 돌아오는 쿠키 정보를 가져오고 쿠키 정보를 다른 페이지에 접근하는 쿠키 정보로 사용하면 된다는 것이다
따라서 new Cookie Jar () 형식을 사용하지 않고 자체적으로 로그인에 성공한 쿠키 정보를 따로 꺼내 저장하면 됩니다.
기밀 없이 로그인하려면 파일이나 데이터베이스에 쿠키만 저장하면 됩니다.

좋은 웹페이지 즐겨찾기