我正在使用我创建的一些 REST 服务在 Android 中编写一个应用程序。这些 Web 服务不会发出标准的 Apache Basic 质询/响应。相反,在服务器端代码中,我想从 HTTP(S) 请求中询问用户名和密码,并将其与数据库用户进行比较,以确保他们可以运行该服务。
我正在使用 HttpClient 来执行此操作,并且在初始登录后我将凭据存储在客户端上(至少我认为这是这样工作的)。所以这就是我卡住的地方。HttpClient 下的抢先式身份验证要求您将拦截器设置为静态成员。这是 Apache 组件使用的示例。
HttpRequestInterceptor preemptiveAuth = new HttpRequestInterceptor() {
@Override
public void process( final HttpRequest request, final HttpContext context) throws HttpException, IOException {
AuthState authState = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE);
CredentialsProvider credsProvider = (CredentialsProvider) context.getAttribute(
ClientContext.CREDS_PROVIDER);
HttpHost targetHost = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
if (authState.getAuthScheme() == null) {
AuthScope authScope = new AuthScope(targetHost.getHostName(), targetHost.getPort());
Credentials creds = credsProvider.getCredentials(authScope);
if (creds != null) {
authState.setAuthScheme(new BasicScheme());
authState.setCredentials(creds);
}
}
}
};
所以问题是这样的。这个的正确用途是什么?当应用程序启动时,我会将其作为应用程序的一部分启动吗?从内存中提取用户名和密码,然后使用它们创建这个 CredentialsProvider,然后由 HttpRequestInterceptor 使用?或者有没有办法更动态地做到这一点?