我尝试在Android上使用Retrofit进行身份验证调用。该调用将302返回到成功或失败页。最初的302响应带回了一个会话cookie,用于在成功时维护身份验证,但是在我有机会使用cookie之前,Retrofit会自动将请求移交给重定向URL。有没有办法阻止重定向?或者有没有一种方法可以在Retrofit上编写一个响应处理程序,在进行第二次调用之前添加适当的头?
2w3rbyxf1#
为了防止重定向,您必须配置您的客户端,例如使用OkHttp 2:
private sendRequest() { OkHttpClient client = new OkHttpClient(); client.setFollowRedirects(false); connectAdapter = new RestAdapter.Builder() .setClient(new OkClient(client)) .setEndpoint("http://yourendpoint") .setLogLevel(RestAdapter.LogLevel.FULL) .build(); connectAdapter.create(YourRequest.class).sendMyRequest("login","password");}
private sendRequest() {
OkHttpClient client = new OkHttpClient();
client.setFollowRedirects(false);
connectAdapter = new RestAdapter.Builder()
.setClient(new OkClient(client))
.setEndpoint("http://yourendpoint")
.setLogLevel(RestAdapter.LogLevel.FULL)
.build();
connectAdapter.create(YourRequest.class).sendMyRequest("login","password");
}
使用OKHTTP 3/4(您可以从@gropapa阅读此answer):
OkHttpClient.Builder builder = new OkHttpClient.Builder();builder.followRedirects(false);OkHttpClient httpClient = builder.build();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.followRedirects(false);
OkHttpClient httpClient = builder.build();
vulvrdjw2#
如果帖子很旧,这里是我的答案与OkHttp 3只是使用建设者如下
在一个Response对象中(实际上我使用的是Retrofit),你会在
response.headers.get("Location")
希望这个能帮上忙
iecba09b3#
我知道这是一个老帖子,也许它仍然会帮助别人。我有一个类似的问题,我的解决方案是添加一个redirectStrategy(http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/RedirectStrategy.html)到httpClient:
private static final RestAdapter REST_ADAPTER= new RestAdapter.Builder() .setEndpoint(HTTP_TEST_URL) .setClient(new ApacheClient(HttpClients.custom() .setRedirectStrategy(new RedirectStrategy() { @Override public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException { return response.getStatusLine().getStatusCode() == 302; } @Override public HttpUriRequest getRedirect(HttpRequest request, HttpResponse response, HttpContext context) throws ProtocolException { //String cookieValue = response.getFirstHeader("Set-Cookie").getValue(); String location = response.getFirstHeader("location").getValue(); HttpUriRequest request_= new HttpGet(location); return request_; }}).build())) .build();
private static final RestAdapter REST_ADAPTER= new RestAdapter.Builder()
.setEndpoint(HTTP_TEST_URL)
.setClient(new ApacheClient(HttpClients.custom()
.setRedirectStrategy(new RedirectStrategy() {
@Override
public boolean isRedirected(HttpRequest request, HttpResponse response,
HttpContext context) throws ProtocolException {
return response.getStatusLine().getStatusCode() == 302;
public HttpUriRequest getRedirect(HttpRequest request,
HttpResponse response, HttpContext context)
throws ProtocolException {
//String cookieValue = response.getFirstHeader("Set-Cookie").getValue();
String location = response.getFirstHeader("location").getValue();
HttpUriRequest request_= new HttpGet(location);
return request_;
}}).build()))
通过这个,我可以访问任何(私有)URL。我认为cookie数据是自动添加的。也许你应该重写getRedirect(),isRedirected()函数来传递你的特殊需求。
0pizxfdo4#
我和你的情况差不多。基本上,我们需要的是捕获服务器在重定向之前返回的“Set-Cookie”头。这是我使用OkHTTP处理它的方式:
final OkHttpClient client = new OkHttpClient();CookieHandler handler = client.getCookieHandler();CookieManager manager = new CookieManager();handler.setDefault(manager);//boilerplate:RequestBody formData = new FormEncodingBuilder() .add("req_username", username) .add("req_password", password).build();Request request = new Request.Builder().url(LOGIN_URL).post(formData).build();Response response = client.newCall(request).execute();if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);// print our cookies:List <HttpCookie> cookies = manager.getCookieStore().getCookies();for(HttpCookie cookie : cookies) { Log.v(TAG, cookie.getName() + "=" + cookie.getValue());}
final OkHttpClient client = new OkHttpClient();
CookieHandler handler = client.getCookieHandler();
CookieManager manager = new CookieManager();
handler.setDefault(manager);
//boilerplate:
RequestBody formData = new FormEncodingBuilder()
.add("req_username", username)
.add("req_password", password).build();
Request request = new Request.Builder().url(LOGIN_URL).post(formData).build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
// print our cookies:
List <HttpCookie> cookies = manager.getCookieStore().getCookies();
for(HttpCookie cookie : cookies) {
Log.v(TAG, cookie.getName() + "=" + cookie.getValue());
vhipe2zx5#
我已经编辑了我以前的答案,因为你在调用登录REST API时最有可能使用POST/PUT,而OkHttp在重定向之前将任何非GET或HEAD请求转换为GET请求,这可能对你不起作用。目前禁用重定向的功能是从OkHttp失踪,但我已经提交了一个拉请求。如果pull请求被接受,它应该允许您禁用重定向,让您有机会暂时自己处理这个用例。下面是pull request https://github.com/square/okhttp/pull/944
5条答案
按热度按时间2w3rbyxf1#
为了防止重定向,您必须配置您的客户端,例如使用OkHttp 2:
使用OKHTTP 3/4(您可以从@gropapa阅读此answer):
vulvrdjw2#
如果帖子很旧,这里是我的答案与OkHttp 3只是使用建设者如下
在一个Response对象中(实际上我使用的是Retrofit),你会在
希望这个能帮上忙
iecba09b3#
我知道这是一个老帖子,也许它仍然会帮助别人。我有一个类似的问题,我的解决方案是添加一个redirectStrategy(http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/RedirectStrategy.html)到httpClient:
通过这个,我可以访问任何(私有)URL。我认为cookie数据是自动添加的。也许你应该重写getRedirect(),isRedirected()函数来传递你的特殊需求。
0pizxfdo4#
我和你的情况差不多。基本上,我们需要的是捕获服务器在重定向之前返回的“Set-Cookie”头。这是我使用OkHTTP处理它的方式:
vhipe2zx5#
我已经编辑了我以前的答案,因为你在调用登录REST API时最有可能使用POST/PUT,而OkHttp在重定向之前将任何非GET或HEAD请求转换为GET请求,这可能对你不起作用。
目前禁用重定向的功能是从OkHttp失踪,但我已经提交了一个拉请求。如果pull请求被接受,它应该允许您禁用重定向,让您有机会暂时自己处理这个用例。
下面是pull request https://github.com/square/okhttp/pull/944