成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

因?yàn)?Java 和 Php 在獲取客戶(hù)端 cookie 方式不同引發(fā)的 bug

legendmohe / 1190人閱讀

摘要:遇到個(gè)和在獲取客戶(hù)端方式不同導(dǎo)致跨系統(tǒng)的問(wèn)題。編碼擴(kuò)展討論與的區(qū)別是什么手冊(cè)上的解釋是返回字符串,此字符串中除了之外的所有非字母數(shù)字字符都將被替換成百分號(hào)后跟兩位十六進(jìn)制數(shù),空格則編碼為加號(hào)。

遇到個(gè) Java 和 Php 在獲取客戶(hù)端 cookie 方式不同導(dǎo)致跨系統(tǒng)的問(wèn)題。所以寫(xiě)了這篇博客梳理下相關(guān)知識(shí)。

實(shí)驗(yàn)

下面通過(guò)兩個(gè)簡(jiǎn)單的實(shí)驗(yàn),來(lái)看Java和Php在獲取web請(qǐng)求中的cookie的不同之處,我下面貼出http請(qǐng)求的相關(guān)信息,和服務(wù)端輸出的結(jié)果。

Java

請(qǐng)求信息

GET / HTTP/1.1
Host: localhost:7003
...
Cookie: test2=ab+cd; test1=ab%2Bcd

服務(wù)端

@Controller
@Slf4j
public class MainController {

    @Autowired
    private HttpServletRequest request;

    @GetMapping("/")
    public @ResponseBody
    String index() {
        Cookie[] cookies = request.getCookies();
        if (null != cookies) {
            for (Cookie cookie : cookies) {
                log.info(cookie.getName() + "=" + cookie.getValue());
            }
        }
        return "index";
    }
}

控制臺(tái)輸出

2019-05-16 18:03:32.770  INFO 10114 --- [nio-7003-exec-1] net.mengkang.demo.MainController         : test2=ab+cd
2019-05-16 18:03:32.770  INFO 10114 --- [nio-7003-exec-1] net.mengkang.demo.MainController         : test1=ab%2Bcd
Php
GET / HTTP/1.1
Host: localhost:8084
...
Cookie: test2=ab+cd; test1=ab%2Bcd

服務(wù)端

var_exprot($_COOKIE);
array (
  "test2" => "ab cd",
  "test1" => "ab+cd",
)
結(jié)果對(duì)比

發(fā)現(xiàn)Java是不會(huì)對(duì)cookie數(shù)據(jù)做任何處理,但是php則會(huì)默認(rèn)進(jìn)行一次urldecode操作,這導(dǎo)致了,兩邊系統(tǒng)里面獲取同一cookie時(shí),結(jié)果不一致的 bug。

類(lèi)似的問(wèn)題 PHP 在解析外部變量時(shí)的一個(gè) BUG
Php 源碼分析

主要查看兩處源碼

main/php_variables.c
ext/standard/url.c
SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data)
{
...
    switch (arg) {
        case PARSE_GET:
        case PARSE_STRING:
            separator = PG(arg_separator).input;
            break;
        case PARSE_COOKIE:
            separator = ";