Java 从重定向URL获取Cookie

Java 从重定向URL获取Cookie,java,httpclient,Java,Httpclient,我有一个url,它会进行两次内部重定向,然后最终返回ok响应 第一个URL:: 重定向URL 1::带有响应302 重定向URL 2::带有响应302 最终URL::响应200 内部重定向URL 1将一些cookie发送到重定向URL 2。 我要做的是获取设置为重定向URL 2:的cookie 这是我的java代码 HttpClient client = HttpClientBuilder.create().build(); HttpGet get = new HttpGet(my

我有一个url,它会进行两次内部重定向,然后最终返回ok响应
第一个URL:
重定向URL 1::带有响应302
重定向URL 2::带有响应302
最终URL::响应200
内部重定向URL 1将一些cookie发送到重定向URL 2。 我要做的是获取设置为重定向URL 2:的cookie

这是我的java代码

 HttpClient client = HttpClientBuilder.create().build();
      HttpGet get = new HttpGet(myurl);
      get.setHeader("User-Agent", "Mozilla");
      get.setHeader("Accept"," text/html,application/xhtml+xml,application/xml;");
      get.setHeader("Accept-Language", "en-US,en;q=0.8");
      get.setHeader("Accept-Encoding"," gzip, deflate");
      get.setHeader("Connection","keep-alive");
      get.setHeader("Cookie",JSESSIONID+");
//    get.setHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
      Header[] requestheaders   =   get.getAllHeaders();
         System.out.println("requestheaders >>> ");
         for(Header header: requestheaders){
             System.out.println(header.getName()+"-------------------- "+header.getValue());
         }
      HttpResponse response = client.execute(get);
      System.out.println("response 7 "+response);
      System.out.println("Headers are");
      Header[] headers = response.getAllHeaders();
      for (int i = 0; i < headers.length; i++) {
          System.out.println((headers[i].getName()+"___________________"+headers[i].getValue()));
      }
HttpClient-client=HttpClientBuilder.create().build();
HttpGet=newhttpget(myurl);
get.setHeader(“用户代理”、“Mozilla”);
get.setHeader(“Accept”,“text/html,application/xhtml+xml,application/xml;”);
get.setHeader(“接受语言”,“en-US,en;q=0.8”);
setHeader(“接受编码”、“gzip、deflate”);
get.setHeader(“连接”,“保持活动”);
get.setHeader(“Cookie”,JSESSIONID+”);
//get.setHeader(“Accept”,“text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8”);
Header[]requestheaders=get.getAllHeaders();
System.out.println(“requestheaders>>>”;
for(标头:requestheaders){
System.out.println(header.getName()+“-------------------”+header.getValue());
}
HttpResponse response=client.execute(get);
系统输出打印项次(“响应7”+响应);
System.out.println(“标题为”);
Header[]headers=response.getAllHeaders();
对于(int i=0;i
此代码为我提供了最终响应,而不是中间重定向响应。
因此,请任何人向我推荐更好的方法

我检查过的另一件事是:-

  • 我禁用了重定向,这个响应给了我这个过程的第一个url
  • 我使用了Jsoup来禁用重定向,它提供了与上面相同的输出
  • 虽然在ruby中获取这种重定向cookie是可能的,但我已经做到了。
    但我必须用java来做这件事。
    httpclient 4.5

    如果您想要对重定向行为进行更多控制,您可能可以更改http客户端的设置

    您可以创建自己的重定向策略并使用它:

    HttpClient instance = HttpClientBuilder.create()
                         .setRedirectStrategy(new LaxRedirectStrategy()).build();
    
    这对我有用

      HttpClient client = HttpClientBuilder.create().setRedirectStrategy(new DefaultRedirectStrategy() {   
    
              public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context)  {
                  boolean isRedirect=false;
                  try {
                    isRedirect = super.isRedirected(request, response, context);
                    Header[] requestheaders =   response.getAllHeaders();
                     System.out.println("getAuthToken  >>> ");
                     for(Header header: requestheaders){
                         System.out.println(header.getName()+"-------------------- "+header.getValue());
                        if(header.getName().equalsIgnoreCase("Set-Cookie") && header.getValue().startsWith("auth-token")){
                          System.out.println("Auth_Cookie "+header.getValue().split(";")[0]);
                          auth_token    =   header.getValue().split(";")[0];
                      }
                     }
                  } catch (ProtocolException e) {
                    e.printStackTrace();
                  }
                  if (!isRedirect) {
                    int responseCode = response.getStatusLine().getStatusCode();
                    if (responseCode == 301 || responseCode == 302) {
                      return true;
                    }
                  }
                  return false;
                }
              }).build();
          HttpGet get = new HttpGet(url);
          client.execute(get);
    

    有关更多技术细节,请查看我的博客。

    我也遇到过同样的问题,我有很多重定向,但我需要将每个响应中的cookie传递给重定向。我本可以做更多的工作来找出每个重定向真正需要的cookie,但我只是建立了一个所有cookie的映射,每个重定向都得到了fu我将从之前的组合重定向中获取一组cookie。这是我的代码

    import java.util.HashMap;
    import java.util.Map;
    
    import org.apache.http.Header;
    import org.apache.http.HttpRequest;
    import org.apache.http.HttpResponse;
    import org.apache.http.ProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.RedirectStrategy;
    import org.apache.http.client.methods.HttpUriRequest;
    import org.apache.http.impl.client.DefaultRedirectStrategy;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.protocol.HttpContext;
    import org.springframework.http.HttpEntity;
    import org.springframework.http.ResponseEntity;
    import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
    import org.springframework.web.client.RestTemplate;
    
    ...
    
        RestTemplate restTemplate = new RestTemplate();
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        RedirectStrategy rs = new DefaultRedirectStrategy() {
            Map<String, Header> cookies = new HashMap<>();
    
            @Override
            public HttpUriRequest getRedirect(HttpRequest request, HttpResponse response,
                                              HttpContext context) throws ProtocolException {
                //
                // Get the cookies out of the response so we can inject them into the redirect.
                //
                for (Header header : response.getHeaders("Set-Cookie")) {
                    this.cookies.put(header.getName(), header);
                }
    
                HttpUriRequest redirect = super.getRedirect(request, response, context);
    
                for (Header cookie : this.cookies.values()) {
                    redirect.addHeader("Cookie", cookie.getValue());
                }
                return redirect;
            }
        };
    
        final HttpClient httpClient = HttpClientBuilder.create().setRedirectStrategy(rs).build();
        factory.setHttpClient(httpClient);
        restTemplate.setRequestFactory(factory);
    
        ResponseEntity<String> response = restTemplate.getForEntity("<my_url>", String.class);
    
    import java.util.HashMap;
    导入java.util.Map;
    导入org.apache.http.Header;
    导入org.apache.http.HttpRequest;
    导入org.apache.http.HttpResponse;
    导入org.apache.http.ProtocolException;
    导入org.apache.http.client.HttpClient;
    导入org.apache.http.client.RedirectStrategy;
    导入org.apache.http.client.methods.HttpUriRequest;
    导入org.apache.http.impl.client.DefaultRedirectStrategy;
    导入org.apache.http.impl.client.HttpClientBuilder;
    导入org.apache.http.protocol.HttpContext;
    导入org.springframework.http.HttpEntity;
    导入org.springframework.http.ResponseEntity;
    导入org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
    导入org.springframework.web.client.rest模板;
    ...
    RestTemplate RestTemplate=新RestTemplate();
    HttpComponents客户端HttpRequestFactory工厂=新的HttpComponents客户端HttpRequestFactory();
    RedirectStrategy rs=新的DefaultRedirectStrategy(){
    Map cookies=新HashMap();
    @凌驾
    公共HttpUriRequest getRedirect(HttpRequest请求、HttpResponse响应、,
    HttpContext(上下文)抛出ProtocolException{
    //
    //从响应中取出cookies,以便我们可以将它们注入重定向。
    //
    for(Header:response.getHeaders(“Set Cookie”)){
    this.cookies.put(header.getName(),header);
    }
    HttpUriRequest redirect=super.getRedirect(请求、响应、上下文);
    for(标头cookie:this.cookies.values()){
    redirect.addHeader(“Cookie”,Cookie.getValue());
    }
    返回重定向;
    }
    };
    最终的HttpClient-HttpClient=HttpClientBuilder.create().setRedirectStrategy(rs.build();
    工厂设置httpClient(httpClient);
    restTemplate.setRequestFactory(工厂);
    ResponseEntity response=restemplate.getForEntity(“,String.class”);
    
    谢谢你的提示,DefaultRedirect策略对我很有效。