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);
httpclient cookie使用介绍的更多相关文章
- httpclient cookie相关介绍
http状态管理 cookie是HTTP代理和目标服务器可以交流保持回话的状态信息的令牌或短包. httpclient使用Cookie接口来代表抽象的cookie令牌,在它的简单形式中http的coo ...
- Android HttpClient HttpURLConnection相关介绍
Android HttpClient HttpURLConnection相关介绍 遇到一个问题 在android studio上用HttpClient编写网络访问代码的时候,发现该类无法导入并使用.. ...
- JMeter 配置元件之HTTP Cookie Manager 介绍
配置元件之HTTP Cookie Manager 介绍 by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13 1. Cookie管理器介绍 Cookie Ma ...
- Session&Cookie 的介绍和使用
Session介绍与使用 1.Session基本介绍 Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及配置信息.这样,当用户在应用程序 ...
- 转:Http协议中Cookie详细介绍
Http协议中Cookie详细介绍 Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie.内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了, ...
- java httpclient cookie
BasicCookieStore cookieStore = new BasicCookieStore();BasicClientCookie cookie = new BasicClientCook ...
- C# HttpClient Cookie验证解决方法
自实现的cookie 验证,远程取值的例子 以下代码配合HttpClient使用可以实现跨域(cookie的读写) //验证 复制代码 代码如下: HttpClient httpClient = ne ...
- HTTPclient cookie的获取与设置
因为代码与Java用apache的HttpClient发送Post请求大部份重复,所以就不贴整段代码了,只把不同的地方贴出来.发送Cookie就必须先得到Cookie,所以至少发送两次请求,第一次用于 ...
- localStorage , sessionStorage ,cookie 使用介绍
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- Ruby基础教程
一.Ruby基础知识 1.关于Ruby Ruby是脚本语言 Ruby是面向对象语言 Ruby是跨平台语言 Ruby是开放源码软件 2.Ruby入门书籍推荐 <Ruby.Programming向R ...
- 【转载】浅谈JavaScript,let和var定义变量的区别
了解JS与ES5与ES6区别 JS语言 JavaScript一种动态类型.弱类型.基于原型的客户端脚本语言,用来给HTML网页增加动态功能. 动态: 在运行时确定数据类型.变量使用之前不需要类型声明, ...
- Bootloader之uBoot简介
本文转载自:http://blog.ednchina.com/hhuwxf/1915416/message.aspx 一.Bootloader的引入 从前面的硬件实验可以知道,系统上电之后,需要一段程 ...
- E: could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporary unavailable) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is an other process using it
1. 问题详细提示如下: E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarly unava ...
- Linux deepin 中Jetbrain Idea等软件中文显示异常
解决方案:安装常用的中文字体 # 文鼎宋体[推荐] sudo apt install fonts-arphic-uming # 文鼎楷体[推荐] sudo apt install fonts-arph ...
- JS post 数组道后台
$("#aSave").click(function () { if ($("#TaskName").val() == "") { aler ...
- 下列java代码中的变量a、b、c分别在内存的______存储区存放。
class A{ private String a = "aa"; public boolean methodB(){ String b = "sb"; fin ...
- mysql 超大数据/表管理技巧
如果你对长篇大论没有兴趣,也可以直接看看结果,或许你对结果感兴趣.在实际应用中经过存储.优化可以做到在超过9千万数据中的查询响应速度控制在1到20毫秒.看上去是个不错的成绩,不过优化这条路没有终点,当 ...
- 如何学好Java大数据并快速提升
Java作为一种最流行的,最热门的编程语言,可以说它无处不在,目前全球有着数十亿的设备正在运行着Java,很多服务器程序都是用Java编写,用以处理每天超过数以千万的数据.无论是手机软件.手机Java ...
- iOS进阶_Socket(Socket简介&代码演练)
网络通讯三要素 TCP & UDP 三次握手 断开连接的四次握手 Socket套接字 了解了上面的概念,我们开始演练一下Socket #import "ViewController. ...