tomcat6 使用comet衍生出的两个额外问题
开发了一个轮询推送功能,网上也有很多文章讲这个就不说怎么做的了。现在发现两个问题:
一:就是登录进主页面后,由于浏览器在不停轮询,导致后端认为前端一直在操作,而正常设定的session超时就跳转到登录页面的功能就失效了。因为服务器认为这个session一直活跃着的。
本以为tomcat会有配置,特定的url不算入session的accessTime,找了很久没有这个功能。那就想有没有办法控制浏览器发送请求的时候不带上JSSESSIONID的cookie,也没办法实现。所以只有用自己写代码的形式来控制了。
总的思路有两种,一种是后端控制,另一种是前端控制。
后端控制的思路就是用过滤器过滤所有请求,把轮询的请求排除,自己来计算session超时的时间,到了就调用session销毁的方法。特别说明一点映射到实现tomcat6的CometProcessor的servlet的url不会经过Filter,这样自动就排除了(一开始不晓得,我还去在struts.xml的配置里把这个url设为excludePattern,其实完全没必要,因为都不会经过struts2的过滤器)。
前端控制的思路是用一些js框架监控前端的事件,如果长时间没有操作,就发送logout请求到服务器。
---------------------------------------------------------------------------------------------------------------------------
tomcat6一个特殊属性:
org.apache.catalina. STRICT_SERVLET_COMPLIANCE |
If this is
If this is
If not specified, the default value of |
这个属性默认值是false。
也就是说我们不设这个值的话,tomcat6去更新session的最后使用时间会在getsession方法被调用的时候才去执行。也就是说如果我们代码里不显示的去获取session的话,即使带着jssessionId这个cookie的请求进来,tomcat也不会去更新session访问时间。所以就很好办了,只要我们轮询url访问的servlet里不显示调用session就OK啦。
反编译tomcat源码出来看了下,如果在tomcat\conf目录下的catalina.properties里把org.apache.catalina. STRICT_SERVLET_COMPLIANCE为true了。那么容器在org.apache.catalina.core.StandarHostValue的invoke方法会执行request.getSession(false);这样时间就被更新了。
二:CometProcessor的线程局部变量问题。
发现一个请求的生命周期里 CometEvent是BEGIN和ERROR的时候CurrentThread并不是同一个(其他两种事件类型的情况没试),而Request是同一个(不是同一个岂不乱套了)。推测tomcat在使用NIO的时候不同的CometEvent并没有一定要同一个Thread来执行,而是从线程池里取一个来执行,当然上下文(主要是Request,Respose)是要保持着的,每次执行的时候要传进来。这也是能理解的,毕竟NIO就是为了大并发处理嘛,执行Begin的那个线程把Begin的逻辑执行完了就该放入线程池里供其他请求使用,如果一定要Error的时候再用这个线程来执行,那这段时间这个线程就不能复用了,也就失去了NIO的意义。
项目里用了一个ThreadLoacl,都在一个全局的Filter里进行设置。开发完轮询功能正常,后来发现轮询的请求根本没进入那个设置ThreadLoacl的Filter,(前面说了CometProcessor的servlet不会经过普通Filter),那怎么还在正常使用呢,ThreadLoacl还有值。原因是其他请求在线程上设置了这个值,线程完了进入线程池并没有执行清除的操作,所以现在从线程池取出来ThreadLoacl也是有值的。(线程对象就是ThreadLoaclMap的一个Key而已)。所以为了正确,CometProcessor里也要进行ThreadLocal的初始化。
tomcat6 使用comet衍生出的两个额外问题的更多相关文章
- 剑指Offer38 数组所有数字出现两次,只有两个出现了一次,找出这两个数字
/************************************************************************* > File Name: 38_Number ...
- LeetCode练习4 找出这两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- C++内存布局(1)-让new出的两个变量在堆上的地址连续
大家都知道栈的地址按照从高到低的顺序增长的, 而堆的地址是按照从底到高的顺序增长的. ); ); cout<<"n1,n2所指的地址:" << n1 < ...
- 【C语言】给一组组数,仅仅有两个数仅仅出现了一次,其它全部数都是成对出现的,找出这两个数。
//给⼀组组数,仅仅有两个数仅仅出现了一次.其它全部数都是成对出现的,找出这两个数. #include <stdio.h> int find_one_pos(int num) //找一个为 ...
- 某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C/C++代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1)------某公司招聘试题
先看看这个题目:某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C代码求出这两个单身整数. 要求: 时间复杂度o(n), 空间复杂度o(1). 我们先用最傻瓜的方式来做吧: #inc ...
- python经典算法题目:找出这两个有序数组的中位数
题目:找出这两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以 ...
- 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)
题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...
- 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)
题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...
- 剑指offer40:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
1 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 2 思路和方法 (1)异或:除了有两个数字只出现了一次,其他数字都出现了两次.异或运算中,任 ...
随机推荐
- 数据类型/强制类型转换 和运算符---标识符规则/关键字 a++和++a区别
3.2关键字都是小写,TRUE FALSE NULL都不是Java关键字 3.3数据类型 变量相当于一个有名称的容器,该容器用于装各种不同类型的数据 Java类型分为2种 基本类型: 引用类型: 基本 ...
- Linux 常用命令小结
学习脚本几天了,总结下linux debian下脚本常用命令. Linux 1.添加删除账户 useradd / userdel 2.修改"张三"密码 passwd 张 ...
- 上海SAP代理商 服装行业ERP系统 达策SAP金牌代理商
上海SAP代理商 服装行业ERP系统 达策SAP金牌代理商上海达策公司的前身是上海InfoPower技术有限公司,该公司在中国ERP软件的销售和服务长达20年.在2005年4月上海达策正式成立,致成立 ...
- PHP一个典型的闭包实例
<?php // 一个基本的购物车,包括一些已经添加的商品和每种商品的数量. // 其中有一个方法用来计算购物车中所有商品的总价格,该方法使 // 用了一个 closure 作为回调函数. cl ...
- IntelliJ IDEA 2016.2.4 最新版激活方法
新版激活方法: 1.在线激活 2016年7月14日 更新: 该域名已无法激活,参见2016.2 的搭建授权服务器激活, 菜单help >>>> Register 选择Licen ...
- openCV_java Canny边缘检测
边缘检测的原理: 检测出图像中所有灰度值变化较大的点,而且这些点连起来构成若干线条,这些线条就称之为图像的边缘. 1986年,由John F. Canny 提出! // Canny(Mat image ...
- Backbone.js Wine Cellar 教程
中文版: http://rd.189works.com/article-74541-1.html http://www.189works.com/article-74542-1.html http:/ ...
- Git中当add错误的时候怎么办?
傻傻分不清楚. “git add .”是我常用的添加命令,添加完后来个“git status ”总是有那么几次发现有不想添加的东西.好多人用reset,nonono,这样不好会有个head错误爆出. ...
- 如何制作CSR文件?
如何制作CSR文件? 在申请数字证书之前,您必须先生成证书私钥和证书请求文件(CSR,Cerificate Signing Request),CSR是您的公钥证书原始文件,包含了您的服务器信息和您的单 ...
- asp.net core 之静态文件目录的操作
文章前言 之前写了一篇关于模拟登录的文章,自我感觉内容不太丰富,今天的这篇文章,希望在内容上能丰富些.本人缺少写文章的经验,技术上也是新手,但我会努力的,希望大家多多支持小弟. asp.net cor ...