2014-01-20 7 views
14

改造の際に承認Cookieヘッダーを追加する方法を知る必要があります。リクエストインタセプターなどを使用するようなアドバイスを見ました。以下は私が試しているものですが、これは正しいですか?まず最初に、セッションIDを取得するためのRequestAdatperが必要でした。これは、要求アダプターのビルダーによってのみ設定できます。しかし、私は最初にセッションIDを取得するようにリクエストする必要がありました。 sessionIdを取得するために2つの残りのアダプタと、取得した後に別のアダプタが必要ですか。私が本当に必要とするのは、取得した後にクッキーを設定するためのアダプターのメソッドですが、そのようなメソッドではありません。これは厄介です。認可Cookieを改造して設定するにはどうすればよいですか? FAQやチュートリアルではこれが表示されません。RETROFIT&AUTH COOKIE

RequestInterceptor requestInterceptor = new RequestInterceptor() 
{ 
    @Override 
    public void intercept(RequestFacade request) { 
     request.addHeader("Set-Cookie", "sessionId="+sessionIdentifier); 
    } 
}; 

RestAdapter.Builder().setServer(serverURL)..setRequestIntercepter(requestIntercepter).build(); 

// but I don't have sessionId when this is first issued ??? 
+1

私のアプリのためにこれを必要としない場合があります

dependencies { ... compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.1' } 

が改修を設定します。しかし、それは大きな質問ですので、誰かが答えてください。 – user3186731

+0

あなたは何をしましたか?答えのコードはちょうど混乱しています...私は私の要求を呼んでいる同じページにそれを含めることを試みています。 – Lion789

答えて

26

インターセプタを参照して、自分自身がRestAdapterのようにシングルトンとして扱います。

public class ApiHeaders implements RequestInterceptor { 
    private String sessionId; 

    public void setSessionId(String sessionId) { 
    this.sessionId = sessionId; 
    } 

    public void clearSessionId() { 
    sessionId = null; 
    } 

    @Override public void intercept(RequestFacade request) { 
    if (sessionId != null) { 
     request.setHeader(...); 
    } 
    } 
} 

今、単にあなたの認証呼び出しの後setSessionIdを呼び出します。以降のすべての要求にはヘッダーが含まれます。

+0

クラス外からsetSessionIdを呼び出す方法を理解しようとしています... ApiHeaders.setSessionIdはメソッドではありません... – Lion789

+0

@ Lion789静的なsetSessionIdが必要です。 – wendigo

+0

@Jake Wharton:レスポンスからsessionIdを取得するにはどうすればよいですか? – Chetna

12

あなたはこの

public class MyCookieManager extends CookieManager { 

    @Override 
    public void put(URI uri, Map<String, List<String>> stringListMap) throws IOException { 
     super.put(uri, stringListMap); 
     if (stringListMap != null && stringListMap.get("Set-Cookie") != null) 
      for (String string : stringListMap.get("Set-Cookie")) { 
       if (string.contains("JSESSIONID")) { 
        Preference.getInstance().setSessionId(string); 
       } 
      } 
    } 
} 

使用このCookieHandlerの

MyCookieManager myCookieManager = new MyCookieManager(); 
     CookieHandler.setDefault(myCookieManager); 

を設定し、あなたの要求に、このようにそれを使用するインターセプタ

String sessionId = preference.getSessionId(); 
        if (sessionId != null) 
         requestFacade.addHeader(Cookie, sessionId); 
+0

うまく働いた!おかげで@クレーナ! –

7

ステップのようなクッキーを取得することができます応答ヘッダーを解析します。 コールバックの中でこのメソッドをオーバーライドsuccessメソッドで呼び出します。

/** 
    * Method extracts cookie string from headers 
    * @param response with headers 
    * @return cookie string if present or null 
    */ 
    private String getCookieString(Response response) { 
     for (Header header : response.getHeaders()) { 
      if (null!= header.getName() && header.getName().equals("Set-Cookie")) { 
       return header.getValue(); 
      } 
     } 
     return null; 
    } 

ステップ2.クッキーとあなたのRequestInterceptorのインスタンスを維持するために、いくつかの静的クラスまたはシングルトンを書きます。 RequestInterceptorの内部で、インターセプトメソッドをオーバーライドして、Cookieをヘッダーに追加します。

public class RestAdapter { 
    private static String cookies; 

    public static String getCookies() { 
     return cookies; 
    } 

    public static void setCookies(String cookies) { 
     RestAdapter.cookies = cookies; 
    } 

    /** 
    * Injects cookies to every request 
    */ 
    private static final RequestInterceptor COOKIES_REQUEST_INTERCEPTOR = new RequestInterceptor() { 
     @Override 
     public void intercept(RequestFacade request) { 
      if (null != cookies && cookies.length() > 0) { 
       request.addHeader("Cookie", cookies); 
      } 
     } 
    }; 

    public static final RestInterface getService() { 
     return new RestAdapter.Builder() 
       .setEndpoint(Config.ENDPOINT) 
       .setRequestInterceptor(COOKIES_REQUEST_INTERCEPTOR) 
       .setConverter(new JacksonConverter()) 
       .setLogLevel(RestAdapter.LogLevel.NONE) 
       .build() 
       .create(RestInterface.class); 
    } 
} 
0

libを使用した単純な解決策です。 com.squareup.okhttp3:okhttp-urlconnection:3.2.0をコンパイルします。

JavaNetCookieJar jncj = new JavaNetCookieJar(CookieHandler.getDefault()); OkHttpClient.Builder().cookieJar(jncj).build();

4
@ sbtgEの回答によると

が、いくつかの修正と。 CookieHandler.getDefault()はnullなので、CookieManagerを使用します。

アプリのbuild.gradle:

service = new Retrofit.Builder() 
     .baseUrl(/* your base URL */) 
     .addConverterFactory(/* your favourite converter */) 
     .client(
       new OkHttpClient.Builder() 
         // this line is the important one: 
         .cookieJar(new JavaNetCookieJar(new CookieManager())) 
         .build()) 
     .build() 
     .create(YourInterface.class); 
+0

切断されている場合のクッキーのクリア方法を教えてください。 –

関連する問題