http代理服务器(五)setcookie
1 cookie是无视端口的(netty(二十三)mycas framework ),chrome的cookie管理器里面也没有端口
用netty(二十四)http代理服务器(三)fiddler【重点】中的程序1,如果访问2个网站,他们的cookie名称一样,比如叫 sessionId,那么后者会覆盖前者
| 线路1 localhost:9001 | 线路2 localhost:9002 |
| 访问A,返回Set-Cookie sessionId | |
| 植入localhost | |
| 访问B,返回Set-Cookie sessionId | |
| 再次植入,覆盖 | |
| session过期 |
2 因此 我们的代理被限制在3条线路了 (没有系统权限不能改host)
localhost
127.0.0.1
局域网ip
3 把不同线路的cookie放在内存map里,而不是放在浏览器中,因为不同线路的cookie,浏览器会覆盖相同host
netty(二十四)http代理服务器(三)fiddler【重点】 中对于set cookie的修改也不需要了,因为都不会给浏览器
4 netty(二十四)http代理服务器(三)fiddler【重点】 中2 和3 不受影响,因为是全局代理,cookie交由浏览器host管理
5



6
5中的Set-Cookie有问题,当服务器的Set-Cookie只是想追加一个Cookie时,会覆盖原有的Cookie
所以map里面应当使用字符串连接追加而不是set
private static synchronized void addCookie(String setCookie, Integer port) {
String [] tmps = setCookie.split(";");
System.out.println("start set cookie " + tmps[0]);
String cookie = cookies.get(port);
String [] origins = cookie.split(";");
Set<MyCookie> set = new HashSet<>();
for(String origin : origins) {
String [] strings = origin.split("=");
MyCookie myCookie = new MyCookie(strings[0], strings[1]);
set.add(myCookie);
}
String [] strings = tmps[0].split("=");
MyCookie myCookie = new MyCookie(strings[0], strings[1]);
if(set.contains(myCookie))
System.out.println("duplicate cookie " + myCookie.getName());
set.add(myCookie);
System.out.println("end set cookie " + myCookie.getName());
String newCookie = new String();
for(MyCookie cook : set) {
newCookie += cook.getName() + "=" + cook.getValue() + ";";
}
cookies.put(port, newCookie);
}
决定性的变化是
before:
cookies.put
after:
先拿,追加 ,再set

7
Set Cookie 与Cookie不同,格式:
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE (http://t.zoukankan.com/feng9exe-p-12871219.html)
Cookie:A=x;B=x;C=x
所以Set-Cookie往往是多个的,而浏览器应该执行所有Set Cookie
所以HttpRes保持Header的那个结构的Map应能处理多个Set-Cookie的key,改写equals和hashcode,直接用Object的
request的仍然用原始Map
决定性的变化:
1)ProxySender

Before:
Map<String,...>
after:
Map<Header,...>
Header 的hashcode equals沿用Object的
2)

返回浏览器的response,用addHeader instead of setHeader
8
因为现在是追加,所以应限制同一个name cookie只能有一个值,包括Set-Cookie刷新某初始Cookie
/**
* 原则上不在io线程上锁
*/
private static synchronized void addCookie(String setCookie, Integer port) {
String [] tmps = setCookie.split(";");
System.out.println("start set cookie " + tmps[0]);
String cookie = cookies.get(port);
String [] origins = cookie.split(";");
Set<MyCookie> set = new HashSet<>();
for(String origin : origins) {
String [] strings = origin.split("=");
MyCookie myCookie = new MyCookie(strings[0], strings[1]);
set.add(myCookie);
}
String [] strings = tmps[0].split("=");
MyCookie myCookie = new MyCookie(strings[0], strings[1]);
if(set.contains(myCookie))
System.out.println("duplicate cookie " + myCookie.getName());
set.add(myCookie);
System.out.println("end set cookie " + myCookie.getName());
String newCookie = new String();
for(MyCookie cook : set) {
newCookie += cook.getName() + "=" + cook.getValue() + ";";
}
cookies.put(port, newCookie);
}
private static class MyCookie {
String name;
String value;
public MyCookie(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public boolean equals(Object obj) {
if(! (obj instanceof MyCookie))
return false;
return name.equals(((MyCookie)obj).getName());
}
@Override
public int hashCode() {
return name.hashCode();
}
8+
hashset事故
浙公网安备 33010602011771号