国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

修改了下webman的請(qǐng)求和響應(yīng)類,使得可以在中間件中更新Cookie

LEO_D86

我修改的目的主要是為了使用中間件能對(duì)cookie進(jìn)行透明的加解密,在這里分享一下,同時(shí)如果有大佬發(fā)現(xiàn)有什么問題也歡迎指出。

修改 Webman\Http\Request

添加updateCookie方法用來刷新請(qǐng)求實(shí)例中的cookie,目的是為了使用中間件來對(duì)請(qǐng)求Cookie進(jìn)行解密。不過需要注意的是,webman會(huì)對(duì)request對(duì)象進(jìn)行緩存,就是滿足一定條件的兩個(gè)請(qǐng)求,后面的請(qǐng)求webman會(huì)直接取出緩存而不再構(gòu)造新的request對(duì)象。還沒有具體看怎么判斷當(dāng)前request對(duì)象是緩存對(duì)象還是新建對(duì)象。

public function updateCookie($name, $value)
{
    if (!isset($this->_data['cookie'])) {
        $this->_data['cookie'] = array();
    }

    $this->_data['cookie'][$name] = $value;
}

修改 Webman\Http\Response

添加若干方法用于在發(fā)送響應(yīng)之前修改cookie,需要先調(diào)用cookiesToJar將響應(yīng)中的Cookie解析出來,然后使用updateCookie來更新,我這里主要用來在中間件中加密,這個(gè)方法不支持添加不存在的cookie,最后使用saveCookie將cookie重新寫入到響應(yīng)中。

...

protected $cookieJar = [];

...

public function cookiesToJar()
{
    if (isset($this->_header['Set-Cookie'])) {
        foreach ($this->_header['Set-Cookie'] as $cookie) {
            $setcookie = [];

            \parse_str(\preg_replace('/; ?/', '&', $cookie), $setcookie);

            $name = array_key_first($setcookie);

            if (!isset($this->cookieJar[$name])) {
                $this->cookieJar[$name] = [];
            }

            if (isset($setcookie['path'])) {
                $this->cookieJar[$name][$setcookie['path']] = array_merge($setcookie, [
                    'value' => $setcookie[$name],
                ]);
            } else {
                $this->cookieJar[$name][] = array_merge($setcookie, [
                    'value' => $setcookie[$name],
                ]);
            }
        }
    }

    return $this->cookieJar;
}

public function updateCookie($name, $value, $path = null)
{
    if (empty($this->cookieJar)) {
        return $this;
    }

    if (isset($this->cookieJar[$name])) {
        if ($path !== null && isset($this->cookieJar[$name][$path])) {
            $this->cookieJar[$name][$path]['value'] = $value;
            return $this;
        }

        $last_key = array_key_last($this->cookieJar[$name]);

        $this->cookieJar[$name][$last_key]['value'] = $value;
    }

    return $this;
}

public function saveCookie()
{
    if (isset($this->_header['Set-Cookie'])) {
        unset($this->_header['Set-Cookie']);
    }

    foreach ($this->cookieJar as $name => $name_cookies) {
        foreach ($name_cookies as $cookie) {var_dump($cookie);
            $this->cookie(
                $name, $cookie['value'], $cookie['max_age'] ?? 0, $cookie['path'] ?? '', $cookie['domain'] ?? '',
                $cookie['secure'] ?? false, $cookie['http_only'] ?? false, $cookie['same_site'] ?? false
            );
        }
    }
}
2088 1 0
1個(gè)評(píng)論

Tinywan

這樣子不好吧!

  • LEO_D86 2022-03-16

    我主要是能夠透明加解密Cookie的方法,目前找不到比較好的辦法,同時(shí)還實(shí)現(xiàn)了一個(gè)Cookie服務(wù),然后使用中間件來通過Cookie服務(wù)添加新cookie。
    我原來用laravel的,發(fā)現(xiàn)有些比較實(shí)用的功能webman并沒有提供,但是誰叫webman快啊。另外,在webman中處理服務(wù)類(單例類)的時(shí)候需要格外小心處理上下文屬性,在同一個(gè)worker中不同請(qǐng)求是共享服務(wù)的,服務(wù)端這方面經(jīng)驗(yàn)不多,有點(diǎn)反PHP的使用直覺(每個(gè)請(qǐng)求都是隔離的)。

年代過于久遠(yuǎn),無法發(fā)表評(píng)論

LEO_D86

200
積分
0
獲贊數(shù)
0
粉絲數(shù)
2022-03-14 加入
??