改造和AUTH COOKIE

use*_*731 16 rest android retrofit okhttp

我需要知道如何在改造中添加授权cookie头.我已经看过使用请求截取等的建议.以下是我正在尝试的,但这是正确的吗?首先,我已经需要一个RequestAdatper来第一次获取会话ID.这只能由请求适配器的构建器设置.但我需要提出一个请求才能获得会话ID.我需要两个休息适配器,一个用于获取sessionId,另一个用于获取它之后.我真正需要的是一个适配器上的方法,在我得到它之后设置cookie,但它似乎不是这样的方法.这变得很尴尬.如何在改造中设置授权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 ???
Run Code Online (Sandbox Code Playgroud)

Jak*_*ton 27

保持对拦截器的引用并将其视为一个像你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(...);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,只需setSessionId在验证通话后拨打电话即可.所有后续请求都将包含标头.


Che*_*tna 12

你可以得到像这样的cookie

 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);
                }
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

使用它来设置CookieHandler

 MyCookieManager myCookieManager = new MyCookieManager();
        CookieHandler.setDefault(myCookieManager);
Run Code Online (Sandbox Code Playgroud)

然后在你的请求拦截器中使用它

 String sessionId = preference.getSessionId();
                    if (sessionId != null)
                        requestFacade.addHeader(Cookie, sessionId);
Run Code Online (Sandbox Code Playgroud)


loc*_*ost 7

步骤1.解析响应头. 在覆盖success方法中的Callback中调用此方法.

    /**
     * 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;
    }
Run Code Online (Sandbox Code Playgroud)

步骤2.编写一些静态类或单例以保留cookie和RequestInterceptor实例.在RequestInterceptor内部覆盖拦截方法,将您的cookie添加到Header.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Mih*_*x64 5

根据@sbtgE的回答,但进行了一些更正。CookieHandler.getDefault()可能为null,因此我使用CookieManager。

应用程序的build.gradle:

dependencies {
    ...
    compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.1'
}
Run Code Online (Sandbox Code Playgroud)

设置改造:

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);
Run Code Online (Sandbox Code Playgroud)