zoukankan      html  css  js  c++  java
  • httpclient cookie使用介绍

    COOKIE的处理

    session的保持是通过cookie来维持的,所以如果用户有勾选X天免登陆,这个session就X天内一直有效,就是通过这个cookie来维持。
    如果没有选中x天免登陆,基本上就是本次才能保持session,下次打开浏览器就要重新登陆了。所以在web安全里,黑客通过XSS,最终目的就是获取cookie,从免登陆直接进入系统
    这次要讲的是得到用户cookie后,免登陆,用httpclient保持原来session访问原本一定要登陆才能做的事情。
    
    本文目的是,得到用户cookie后,免登陆,用httpclient保持原来session访问原本一定要登陆才能做的事情
    HttpClient 4.x库可以自己处理Cookie
    有两种方法来添加cookie
    通过httpclient.setCookieStore(cookieStore)
    通过httpGet或者httpPost的addHeader(new BasicHeader("Cookie",cookie));
    

    第一种方法

    httpClient是否在下次请求中携带从服务器请求带来的Cookie,完全是有设置决定的。
    httpclient.getParams.setParameter(ClientPNames.COOKIE_POLICY,CookiePolicy.BEST_MATCH或者CookiePolicy.BROWSER_COMPATIBILITY。如果设置为Cookie策略为BEST_MATCH,或者BROWER_COMPATIBILITY的话,HttpClient会在请求中携带有服务器返回的Cookie。
    如果不设置,应该需要手动添加CookieStore,才会保持session.
    如果设置为Cookie策略为默认的话,没设置,则需要手动通过httpclient.setCookieStore(cookieStore)去设置。
    
    note: 如果用的是同一个HttpClient(上下两个请求用同一个httpclient对象。
    且没去手动连接释放掉client.getConnectionManager().shutdown();)!
    都不用去设置cookie的ClientPNames.COOKIE_POLICY。httpClient都是会保留cookie的!
    
    void main(){
     CookieStore cookieStore = new BasicCookieStore();
     //---将cookie设置到httpclient中---//
     CloseableHttpClient HttpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
     try{
      HttpPost post = new HttpPost(”http://www.baidu.com");
      BasicClientCookie cookie = new BasicClientCookie("name","zhaoke");
      cookie.setVersion(0);
      cookie.setPath("/");
      cookie.setDomain("www.baidu.com");//设置范围
      cookeStore.addCookie(cookie);
      
       httpClient.execute(post);
       List<Cookie> cookies = cookieStore.getCookies();
       for(Cookie cook: cookies){
          System.out.println("Local cookie:"+cookies.get(i));
       } 
     }catch(Exception e){
      e.printStackTrace();
     }finally{
      httpClient.close();
     }
    }
    

    第二种方法

    通过Header去设置cookie
    我们首先要得到一个登陆的cookie,免登陆访问,可以用浏览器登陆,然后F12通过console执行document.cookie得到cookie
    用这个cookie,在访问的时候,设置httpGet或者httpPost的addHeader(new BasicHeader("Cookie",cookie));就可以免登陆访问
    

    COOKIE自定义

    实际使用中client的过程中,会遇到一种情况,如cookie的key为空的,此时默认的cookie的策略处理cookie是会报错的。
    这是可以通过重写cookiestore策略来解决
    
    private static void setCustomCookieSpec(HttpClientBuilder builder){
      CookieSpecProvider easySpecProvider = new CookieSpecProvider(){
        public org.apache.http.cookie.CookeSpec create(HttpContext context){
          return new BrowserCompatSpec(){
            public void validate(Cookie cookie,CookieOrigin prigin) throws Exeption{  }
           
            protected List<Cookie> parse(final HeaderElement[] elems,final CookieOrigin origin) throw Exception{
             final List<Cookie> cookies = new ArrayList<cookie>(elems.length);
             for(final HeaderElement headerelement: elems){
               String name = headerelement.getName();
               String value = headerelement.getValue();
             } 
             if(value==null){ continue; }
             if(name==null || name.length()==0){ throw new MalformedCookieException("Cookie name may not be empty"); }
             final BasicClientCookie cookie = new BasicClientCookie(name,value);
             cookie.setPath(getDefaultPath(origin));
             cookie.setDomain(getDefaultDomain(origin));
            // cycle through the paramters
             final NameValuePair attribs = headerelement.getParameter();
             for(int j=attribute.length-1;j>=0;j--){
               final NameValuePair attrib = attribs[j];
               final String s = attrib.getName().toLowerCase(Locale.ENGLISH);
               cookie.setAttribute(s,attrib.getValue());
               final CookieAttributeHandler handler = findAttribHandler(s);
               if(handler!=null){ handler.parse(cookie,attrib.getValue()); }
             } 
            cookies.add(cookie);
           }
          }
         return cookies;
       }
     };
    }
    
    Registry<CookieSpecProvider> r = RegistryBuilder
                .<CookieSpecProvider> create()
                .register(CookieSpecs.BEST_MATCH, new BestMatchSpecFactory())
                .register(CookieSpecs.BROWSER_COMPATIBILITY, new BrowserCompatSpecFactory())
                .register("easy", easySpecProvider).build();
    builder.setDefaultCookieSpecRegistry(r);
    
  • 相关阅读:
    devops之 gitlab-ci + mesos + docker + marathon 持续发布③marathon常用api的使用
    centos7环境下二进制编译安装ffmpeg
    jenkins2.236 + sonarqube7.6 + sonar-scanner3.3的集成配置和生产环境使用示例
    zabbix添加top10内存和cpu资源占用情况
    Marathon基于有认证的harbor仓库创建应用
    devops之 gitlab-ci + mesos + docker + marathon 持续发布③marathon 结合 gitlab-ci的CICD持续发布
    docker拉取指定版本的centos和python镜像
    devops之 gitlab-ci + mesos + docker + marathon 持续发布②安装marathon
    devops之 gitlab-ci + mesos + docker + marathon 持续发布①mesos集群环境的搭建
    zabbix4.0监控gpu
  • 原文地址:https://www.cnblogs.com/ssgao/p/8829037.html
Copyright © 2011-2022 走看看