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的修改也不需要了,因为都不会给浏览器

 

netty(二十四)http代理服务器(三)fiddler【重点】 中2 和3 不受影响,因为是全局代理,cookie交由浏览器host管理

 

 

 

 

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事故


 

 

 



 

posted on 2022-11-18 23:06  silyvin  阅读(182)  评论(0)    收藏  举报