cookie的domain实战

setcookie方法

bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] )

setcookie方法中,第5个参数是domain参数,通过这个参数可以解决顶级域名和多级域名共享cookie的问题。换句话说,假设我们有一个顶级域名test.com,那么如果设置cookie的时候将domain设置成test.com的话,那么在blog.test.combbs.test.com中都可以使用这个cookie,可以解决多个项目之间共享cookie的问题。

cookie的domain实战

配置host文件

在host文件中配置上这样的一段

127.0.0.1  test.com #顶级域名 
127.0.0.1  passport.test.com #登录二级域名 
127.0.0.1  blog.test.com #博客二级域名
127.0.0.1  error.blog.test.com #博客错误地址二级域名
127.0.0.1  bbs.test.com #论坛二级域名

配置虚拟主机

由于是在我的本地测试的,我的本地采用的是apache服务器,所以先启用vhost文件,然后在vhost文件中添加以下的的配置。

#主应用
<VirtualHost *:80>
    DocumentRoot "${SRVROOT}/htdocs/test/cookie/main"
    ServerName test.com
</VirtualHost>

#登录应用
<VirtualHost *:80>
    DocumentRoot "${SRVROOT}/htdocs/test/cookie/passport"
    ServerName passport.test.com
</VirtualHost>

#博客应用
<VirtualHost *:80>
    DocumentRoot "${SRVROOT}/htdocs/test/cookie/blog"
    ServerName blog.test.com
</VirtualHost>

#错误的博客地址
<VirtualHost *:80>
    DocumentRoot "${SRVROOT}/htdocs/test/cookie/blog/error"
    ServerName error.blog.test.com
</VirtualHost>

#论坛应用
<VirtualHost *:80>
    DocumentRoot "${SRVROOT}/htdocs/test/cookie/bbs"
    ServerName bbs.test.com
</VirtualHost>

项目结构图

这里写图片描述

bbs:论坛项目
blog:博客项目
error.blog:错误的博客地址
main:主项目
passport:登录项目

运行结果图

这里写图片描述

首先打开test.com,显示没有登录,然后点击登录,跳转到passport.test.com项目中进行登录,然后将用户名写入到cookie中,这里的cookie的domain为test.com,然后测试了blog.test.combbs.test.com中是否存在cookie,显示都是有cookie的,表示我们设置的domain生效了。

passport项目

index.php登录界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h1>登录界面</h1>
    <form action="dologin.php" method="post">
        <p>用户名:<input type="text" name="username"></p>
        <p>密码:<input type="password" name="password"></p>
        <p><input type="submit" value="登录"></p>
    </form>
</body>
</html>

dologin.php处理登录逻辑

<?php
header("Content-type:text/html;charset=utf-8");
$username = $_POST['username'];
$password = $_POST['password'];
if(!empty($username) && !empty($password)){
    if($username == 'zhangsan' && $password == '123456'){
        //将用户保存到cookie中
        setcookie('username',$username,0,'/','test.com');
        echo '<script>location.href="http://test.com"</script>';
    }
}
?>

这里首先进行判断用户名和密码是否正确,然后将保存cookie,跳转到主项目。

每个项目的首页

<?php
print_r('当前域名:'.$_SERVER['SERVER_NAME'].'<br/>');
$username = isset($_COOKIE['username']) ? $_COOKIE['username'] : '';
if(!empty($username)){
    echo '已登录,用户名:'.$username;
}else{
    echo '尚未登录,';
    echo '<a href="http://passport.test.com">请前往登录</a>';
}
?>

每个项目中都有一个index.php,这个文件是判断是否有cookie存在,如果有就显示出来

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
回答: CookieDomain属性用于指定可以访问该Cookie的域名范围。默认情况下,CookieDomain属性值为请求的地址。如果要在多个域名之间共享Cookie,可以将CookieDomain属性设置为这些域名的公共父域名。例如,如果域A为t1.study.com,域B为t2.study.com,要在这两个域名之间共享Cookie,就需要将CookieDomain属性设置为.study.com。这样,两个域名下的网页都可以访问该Cookie。注意,一般在域名前需要加一个".",如"domain=.study.com"。\[2\] 另外,如果在设置Cookie时没有显式声明Domain属性,浏览器会根据当前的域名进行特殊处理。在火狐浏览器中,该Cookie的信息会有一个主机项,而域项会消失。在Chrome浏览器中,虽然有域这个项,但域的前面少了一个点。因此,如果显式声明了Domain属性,不管域中是否带点,到Chrome浏览器中都是带点存储的。只有在没有显式声明域的情况下,浏览器存储的域会去掉点。例如,在e.f.com.cn服务主机中生成的Cookie,只有e.f.com.cn的服务器能够获取到,子域名无法获取到这个Cookie。\[3\] #### 引用[.reference_title] - *1* *2* [cookiedomain属性](https://blog.csdn.net/longgege001/article/details/81274088)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [前端----cookie的域:domain](https://blog.csdn.net/q5706503/article/details/83046884)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值