专栏首页NetkillerSession 的 Cookie 域处理(多域名虚拟主机)

Session 的 Cookie 域处理(多域名虚拟主机)

2.5.3. Session 的 Cookie 域处理

环境

		User -> Http2 CDN -> Http2 Nginx -> proxy_pass 1.1 -> Tomcat 

背景,默认情况下 tomcat 不会主动推送 Cookie 域,例如下面的HTTP头

		Set-Cookie: JSESSIONID=8542E9F58C71937B3ABC97F002CE039F;path=/;HttpOnly		

这样带来一个问题,在浏览器中默认Cookie域等于 HTTP_HOST 头(www.example.com),如果网站只有一个域名没有问题,如果想共享Cookie给子域名下所有域名 *.example.com 无法显示。

通过配置Tomcat sessionCookieDomain="example.com" 可以实现推送 Cookie 域

		<Context path="" docBase="/www/netkiller.cn/www.netkiller.cn"  reloadable="false" sessionCookieName="PHPSESSID" sessionCookieDomain="netkiller.cn" sessionCookiePath="/" />		

这样的配置一般用户的需求都可以满足。我的需求中还有一项,在服务器绑定多个域名(二级域名)。问题来了 Tomcat 将始终推送 netkiller.cn 这个域。其他域名无法正确设置Cookie

		$ curl -s -I -H https://www.netkiller.cn/index.jsp | grep Set-Cookie
Set-Cookie: PHPSESSID=4DBAF36AA7B79CE1ACBA8DD67702B945;domain=netkiller.cn;path=/;HttpOnly

$ curl -s -I -H 'Host: www.test.com' https://www.test.com/index.jsp | grep Set-Cookie
Set-Cookie: PHPSESSID=4DBAF36AA7B79CE1ACBA8DD67702B945;domain=netkiller.cn;path=/;HttpOnly

$ curl -s -I -H 'Host: www.example.com' https://www.example.com/index.jsp | grep Set-Cookie
Set-Cookie: PHPSESSID=4DBAF36AA7B79CE1ACBA8DD67702B945;domain=netkiller.cn;path=/;HttpOnly		

怎样处理需求呢,我两个两个方案,一个方案是在Nginx中配置,另一个方案是在代码中解决。其中Nginx处理起来比较灵活无需开发测试介入,最终选择nginx方案

		server {
	listen       443 ssl http2 default_server;
	server_name _;
    location ~ \.(do|jsp|action)$ {

        ssi on;
	    proxy_set_header Accept-Encoding "";
	    proxy_pass http://127.0.0.1:8080;
        proxy_set_header    Host    $host;
        proxy_set_header    X-Real-IP   $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;

        set $domain $host;
	    if ($host ~* ^([^\.]+)\.([^\.]+)\.([^\.]+)$) {
	        set $domain $2.$3;
	    }
	    proxy_cookie_domain netkiller.cn $domain;
    }
}		

server_name _; 接受任何域名绑定,default_server 将vhost 设置为默认主机。最终测试结果:

		$ curl -s -I -H https://www.netkiller.cn/index.jsp | grep Set-Cookie
Set-Cookie: PHPSESSID=4DBAF36AA7B79CE1ACBA8DD67702B945;domain=netkiller.cn;path=/;HttpOnly

$ curl -s -I -H https://www.example.com/index.jsp | grep Set-Cookie
Set-Cookie: PHPSESSID=4DBAF36AA7B79CE1ACBA8DD67702B945;domain=example.com;path=/;HttpOnly

$ curl -s -I -H https://www.domain.com/index.jsp | grep Set-Cookie
Set-Cookie: PHPSESSID=4DBAF36AA7B79CE1ACBA8DD67702B945;domain=domain.com;path=/;HttpOnly		

本文分享自微信公众号 - Netkiller(netkiller-ebook),作者:景峰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-03-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 以太坊私链入门

    中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>

    netkiller old
  • SSH 安全·屏蔽试图穷举密码的IP地址

    检查疯狂链接SSH端口的IP地址 curl -s https://raw.githubusercontent.com/oscm/shell/master/mon...

    netkiller old
  • 因果图在运维工作中的应用

    因果图在运维工作中的应用 目录 1. 什么是因果图 2. 为什么使用因果图 3. 何时使用因果图 4. 何处使用因果图 5. 谁来负责制作因果图 6. 怎样使用...

    netkiller old
  • 大佬经手过:车享家融资10亿

    汽车行业从整车、二手车电商到售后服务,备受投资者和创业者青睐。汽车o2o服务平台“车享家”宣布获得10亿元融资,品牌双拼域名chexiang.com也引人瞩目。

    躲在树上的域小名
  • 一位Java工程师的阶段性工作总结

    1.1.1、通常的模块分布:一般如果你要实现一个web应用,你从后台将数据展示到前端页面,在一个比较大的公司,你少不了跟其他项目有交集(你调用他的接口,他依赖你...

    lyb-geek
  • 一位Java工程师的阶段性工作总结

    1.1.1、通常的模块分布:一般如果你要实现一个web应用,你从后台将数据展示到前端页面,在一个比较大的公司,你少不了跟其他项目有交集(你调用他的接口,他依赖你...

    Java团长
  • CAS客户端服务器端配置步骤

    CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一...

    流柯
  • 大整数相乘“分治法”和“循环暴力法”

    输入描述: 空格分隔的两个字符串,代表输入的两个大整数 输出描述: 输入的乘积,用字符串表示

    本人秃顶程序员
  • 「 互联网笔试题 」No.2 2018酷狗秋招笔试题

    一.单选题 1、在命中率极高的缓存设计中,时间复杂度最差的数据结构是( ) A. 数组 B. 链表 C. 树 D. 哈希表

    KEN DO EVERTHING
  • 用简单易懂的例子解释隐马尔可夫模型

    隐马尔可夫(HMM)好讲,简单易懂不好讲。我希望我的读者不是专家,而是对这个问题感兴趣的入门者,所以我会多阐述数学思想,少写公式。霍金曾经说过,你多写一个公式,...

    AI研习社

扫码关注云+社区

领取腾讯云代金券