認証を行い、リクエストで Cookie をチェックして、同じクライアントからの後続の呼び出しを許可する Web アプリケーションがあります。Eclipse から実行すると問題なく動作するコードを作成しましたが、Android エミュレーターから実行すると失敗します。これが私がしたことです
URI の Web リソースを作成し、それにフィルターをバインドして Cookie をリクエストに添付するクラス
public class TolvenRestClient {
private static Client client;
private static final ThreadLocal<String> instance = new ThreadLocal<String>();
static {
ClientConfig config = new DefaultClientConfig();
client = Client.create(config);
client.setFollowRedirects(true);
}
private Client getClient() {
return client;
}
public WebResource getResource(String path){
WebResource webResource = getClient().resource(path);
webResource.addFilter(new ClientFilter() {
@Override
public ClientResponse handle(ClientRequest clientRequest) throws ClientHandlerException {
if (instance.get() != null) {
clientRequest.getHeaders().putSingle("Cookie", "SSOCookie=" + instance.get());
}
ClientResponse clientResponse = getNext().handle(clientRequest);
String cookieName = "SSOCookie";
System.out.println("cookies "+clientResponse.getCookies());
for (NewCookie newCookie : clientResponse.getCookies()) {
if (cookieName.equals(newCookie.getName())) {
String extendedSessionId = newCookie.getValue();
instance.set(extendedSessionId);
break;
}
}
return clientResponse;
}
});
return webResource;
}
次に、Web サービス呼び出しをトリガーするサンプル コード
RestClient client = new RestClient();
MultivaluedMap<String, String> formData = new MultivaluedMapImpl();
formData.add("username", "demo");
formData.add("password", "1234qwer");
formData.add("realm", "tolven");
WebResource webResource = client.getResource("https://dev.example.com:8443/gatekeeper/rs/authenticate/login");
ClientResponse response = webResource.type(MediaType.APPLICATION_FORM_URLENCODED).post(ClientResponse.class,formData);
//ClientResponse response = webResource.accept("text/html").get(ClientResponse.class);
System.out.println("Here ....." + response.toString());
webResource = client.getResource("https://dev.example.com:8443/api/vestibule/accountList");
response = webResource.get(ClientResponse.class);
Accounts accounts = response.getEntity(Accounts.class);
このコードは、Eclipse から実行すると問題なく動作します。しかし、Androidエミュレーター内で実行すると、クライアントの応答からCookieを読み取ることができません
以下の例外が発生します
09-20 19:55:31.067: W/System.err(1172): java.lang.NullPointerException
09-20 19:55:31.077: W/System.err(1172): at javax.ws.rs.core.NewCookie.valueOf(NewCookie.java:126)
09-20 19:55:31.077: W/System.err(1172): at com.sun.jersey.api.client.ClientResponse.getCookies(ClientResponse.java:714)
09-20 19:55:31.077: W/System.err(1172): at com.userexample.LoginActivityTolven$1$1.handle(LoginActivityTolven.java:71)
09-20 19:55:31.088: W/System.err(1172): at com.sun.jersey.api.client.WebResource.handle(WebResource.java:680)
09-20 19:55:31.088: W/System.err(1172): at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
09-20 19:55:31.097: W/System.err(1172): at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:568)
09-20 19:55:31.097: W/System.err(1172): at com.userexample.LoginActivityTolven$1.onClick(LoginActivityTolven.java:86)
09-20 19:55:31.097: W/System.err(1172): at android.view.View.performClick(View.java:4240)
09-20 19:55:31.097: W/System.err(1172): at android.view.View$PerformClick.run(View.java:17721)
09-20 19:55:31.107: W/System.err(1172): at android.os.Handler.handleCallback(Handler.java:730)
09-20 19:55:31.107: W/System.err(1172): at android.os.Handler.dispatchMessage(Handler.java:92)
09-20 19:55:31.107: W/System.err(1172): at android.os.Looper.loop(Looper.java:137)
09-20 19:55:31.107: W/System.err(1172): at android.app.ActivityThread.main(ActivityThread.java:5103)
09-20 19:55:31.107: W/System.err(1172): at java.lang.reflect.Method.invokeNative(Native Method)
09-20 19:55:31.117: W/System.err(1172): at java.lang.reflect.Method.invoke(Method.java:525)
09-20 19:55:31.117: W/System.err(1172): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-20 19:55:31.117: W/System.err(1172): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-20 19:55:31.117: W/System.err(1172): at dalvik.system.NativeStart.main(Native Method)
以前に Android で Jersey クライアントを使用して、この問題を見た人はいますか?