12cd使用了很多的二级域名,类似javaeye的频道栏目。在tomcat6.0下跨域会造成session丢失。当时也没找到tomcat哪里可以设置session cookies地方。
所以就自己设计了一套解决方案。
12cd目前前端使用的是Apache2,应用服务器是tomcat6.0. Apache2 主要提供虚拟主机以及负载均衡的作用,通讯使用的是AJP.
下面介绍一下实现步骤:
1 建立一张onlineusers内存表
CREATE TABLE `onlineusers` (
`id` bigint(20) NOT NULL,
`operations` varchar(600) DEFAULT NULL,
`last_active_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`login_time` timestamp NULL DEFAULT NULL,
`s_sessionId` varchar(80) DEFAULT NULL,
`s_ramdon` varchar(80) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MEMORY DEFAULT CHARSET=gbk CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC
id 存的使用户表id
last_active_time 记录用户最后一次操作时间
s_ramdon 这个存储是随机产生的32位字符串。后面会有用途。
2 当用户进行登录操作时
验证完成后写入一个cookie,内容包括用户ID,用户名,用户密码,以及一个随机产生的32位字符串A,用一定的形式组织后加密。
接着往onlineusers表插入相应的记录。其中s_ramdon 保存的刚才那个字符串A。
3 提供一个filter
当用户在做操作的时候,比如访问用户中心的时候,filter会做一下工作:
- filter检查用户的cookie以及onlineusers,如果缺少两个中的任何一个记录,我们就判定用户没有登录,清空相关记录,删除session中uid属性。
- 假设存在相关cookie和onlineusers表的记录,对他们进行比对。
- 对比不一致(比如有人篡改cookie等) 清除cookie以及onlineusers相关记录,删除session中uid属性
- 符合条件后,我们判断用户的session是否有uid属性,如果没有我们为他设置uid属性,并更新onlinusers 的last_active_time 字段。
- 之后所有的流程不变,根据session中是否包含uid判断用户是否登录以及是否允许相关操作
4 后台提供一个必要的定时器
我们后台有个定时器,定期清除onlineusers表中超过半小时内没有任何更新的记录,并且删除用户相应的cookie,清空session.
这就相当与用户session失效登出
Ok 工作就这么多。看看这种方案给我们带来了那些好处
- 已经可以做到跨二级域名了。因为我们cookie的domain是设置到根域下的.12cd.com
- 轻松统计在线用户 只要简单查询 onlinusers表即可。我们网站有个功能就是可以查看到到空间留言的人的性别和是否现在在线就是通过查询onlineusers表实现的
- 还有一个比较有趣的增值功能是实现了集群和无中断更新部署。这个我们在下一篇文章中会提到
另外javaeye提供了用户正在做什么的功能。12cd 也有类似的功能。曾经咨询过robbin javaeye是如何实现,robbin 说是通过内存表记录用户的url来进行判断的。12cd则主要是通过Hibenrate的interceptor回调来实现。比如对日记有 保存操作,那就说明用户正在写日记。这个是题外话了
分享到:
相关推荐
解决Tomcat跨域的两个jar包,java-property-utils-1.9.jar和cors-filter-1.7.jar
Tomcat 在设置跨域 jar包的一部分,cors-filter-1.7.jar,cors-filter-2.5.jar,cors-filter-2.10.jar
GeoServer跨域问题 jetty-servlets-9.4.44.v20210927.jar jetty-util-9.4.44.v20210927.jar
cors-filter-1.7.jar,java-property-utils-1.9.jar Geoserver 安装及CORS跨域资源访问配置
最全面关于J2EE跨域资源共享的解决方案以及所需要依赖的Jar包,cors-filter-1.7.jar,java-property-utils-1.9.jar,.......看完这些还不能解决你的问题,联系QQ:1552298726
tomcat跨域cors相关jar包 java-property-utils-1.9.jar,cors-filter-1.7.jar,java-util-1.9.1.jar
Tomcat 在设置跨域 jar包的二部分,java-property-utils-1.9.1.jar,java-property-utils-1.10.jar
这两个jar包是配置CORS跨域访问时需要的,具体的配置方式请参考http://blog.csdn.net/liuxins/article/details/53944891
Allow-Control-Allow-Origin 谷歌跨域扩展插件解决app本地跨域调试附教程
需要从公司文服直接展示pdf,折腾了大半天,网上查了各种资料,都比较坑,自己看官方demo写了一个springboot的demo,下载后修改pdf的地址可以直接运行,完美实现pdf跨域显示
cors-filter-1.7.jar,Java-property-utils-1.9.jar Arcgis Server 10.2 跨域配置所需jar包
----12.GET跟POST请求.mp4 ----13.三元运算符.mp4 ----14.mysql数据库文件类型+创建数据库+创建表+字段.mp4 ----15.文件包含上.mp4 ----16.文件包含下.mp4 ----17.MYSQL所有操作.mp4 ----18.PHP操作数据库.mp4 ----...
前后端分离,本地前端开发调用接口会有跨域问题,一般有以下3种解决方法: 1. 后端接口打包到本地运行(缺点:每次后端更新都要去测试服下一个更新包,还要在本地搭建java运行环境,麻烦) 2. CORS跨域:后端接口...
Allow-Control-Allow-Origin最新谷歌跨域扩展插件下载
spring解决跨域问题(两种方式,配有文档) cors-filter-1.7.jar java-property-utils-1.9.1.jar
JAVA调用外接设备(制卡机)---JQuery跨域,AJAX跨域问题
H5的video标签跨域.HTML的video标签跨域 我们都知道HTML video标签能播放视频 但是如果你的video要播放的是非当前域名下的视频文件,这就要跨域播放视频, 应该如何实现呢?
layer弹窗:top.layer弹窗到父页面跨域,通过postMessage方法将子页面的配置对象发送到父页面中,父页面再通过子页面的配置对象打开弹窗,对象内不能存在事件。
如果Cesium无法显示tomcat发布的瓦片,则需要对Tomcat做跨域处理,做法如下: 首先下载cors-filter-2.5.jar和java-property-utils-1.9.1