开发了一个轮询推送功能,网上也有很多文章讲这个就不说怎么做的了。现在发现两个问题:

一:就是登录进主页面后,由于浏览器在不停轮询,导致后端认为前端一直在操作,而正常设定的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 true the following actions will occur:

  • any wrapped request or response object passed to an application dispatcher will be checked to ensure that it has wrapped the original request or response. (SRV.8.2 / SRV.14.2.5.1)
  • a call to Response.getWriter() if no character encoding has been specified will result in subsequent calls to Response.getCharacterEncoding() returning ISO-8859-1 and the Content-Type response header will include a charset=ISO-8859-1 component. (SRV.15.2.22.1)
  • every request that is associated with a session will cause the session's last accessed time to be updated regardless of whether or not the request explicitly accesses the session. (SRV.7.6)
  • cookies will be parsed strictly, by default v0 cookies will not work with any invalid characters. 
    If set to false, any v0 cookie with invalid character will be switched to a v1 cookie and the value will be quoted.
  • the path in ServletContext.getResource / getResourceAsStream calls must start with a "/".
    If set to false, code like getResource("myfolder/myresource.txt") will work.

If this is true the default value will be changed for:

  • org.apache.catalina.connector.Request. ALLOW_EMPTY_QUERY_STRING property
  • org.apache.tomcat.util.http.ServerCookie. PRESERVE_COOKIE_HEADER property
  • The webXmlValidation attribute of any Context element.
  • The webXmlNamespaceAware attribute of any Context element.
  • The tldValidation attribute of any Context element.

If not specified, the default value of false will be used.

这个属性默认值是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衍生出的两个额外问题的更多相关文章

  1. 剑指Offer38 数组所有数字出现两次,只有两个出现了一次,找出这两个数字

    /************************************************************************* > File Name: 38_Number ...

  2. LeetCode练习4 找出这两个有序数组的中位数

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2  ...

  3. C++内存布局(1)-让new出的两个变量在堆上的地址连续

    大家都知道栈的地址按照从高到低的顺序增长的, 而堆的地址是按照从底到高的顺序增长的. ); ); cout<<"n1,n2所指的地址:" << n1 < ...

  4. 【C语言】给一组组数,仅仅有两个数仅仅出现了一次,其它全部数都是成对出现的,找出这两个数。

    //给⼀组组数,仅仅有两个数仅仅出现了一次.其它全部数都是成对出现的,找出这两个数. #include <stdio.h> int find_one_pos(int num) //找一个为 ...

  5. 某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C/C++代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1)------某公司招聘试题

    先看看这个题目:某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C代码求出这两个单身整数. 要求: 时间复杂度o(n), 空间复杂度o(1). 我们先用最傻瓜的方式来做吧: #inc ...

  6. python经典算法题目:找出这两个有序数组的中位数

    题目:找出这两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以 ...

  7. 在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1)

    题目:在一个数组中,除了两个数外,其余数都是两两成对出现,找出这两个数,要求时间复杂度O(n),空间复杂度O(1) 分析:这道题考察位操作:异或(^),按位与(&),移位操作(>> ...

  8. 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...

  9. 剑指offer40:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字

    1 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 2 思路和方法 (1)异或:除了有两个数字只出现了一次,其他数字都出现了两次.异或运算中,任 ...

随机推荐

  1. JQ中 trigger()和triggerHandler()区别

    既然使用了trigger和triggerHandler,那么你应该了解了他们的差别了. trigger():在每一个匹配的元素上触发某类事件. triggerHandler():这个特别的方法将会触发 ...

  2. 开发ERP软件应该遵守的22条规则

    总结一下做管理软件,有哪些项是经过检验的条款,必须遵守的. 界面篇 1  要保存用户的偏号(profile/favourite). ASP.NET 2.0引入此功能,当用户修改默认的控件的属性时,框架 ...

  3. WPF面板布局介绍Grid、StackPanel、DockPanel、WrapPanel

    回顾 上一篇,我们介绍了基本控件及控件的重要属性和用法,我们本篇详细介绍WPF中的几种布局容器及每种布局容器的使用场景,当 然这些都是本人在实际项目中的使用经验,可能还存在错误之处,还请大家指出. 本 ...

  4. mysql导入数据出错

    今天准备移动网站到另外一个服务器,用的是mysql数据库,导出的时候正常,导入的时候出现了一个错误,纠结了半天 最后打开sql文件发现导出的sql确实有问题 具体什么原因不清楚,只好把以前备份的sql ...

  5. 数据导入读取read.table函数详解,如何读取不规则的数据(fill=T)

    函数 read.table 是读取矩形格子状数据最为便利的方式.因为实际可能遇到的情况比较多,所以预设了一些函数.这些函数调用了 read.table 但改变了它的一些默认参数. 注意,read.ta ...

  6. 修改oracle密码有效期限制

    racle11g,静默安装后用户的密码有效期默认设置为180天,180天后密码将失效,oracle会提示要修改密码.   我们项目用的是jdbc连接oracle数据库,没法自动处理oracle的这种密 ...

  7. Infer初体验 for Android

    安装Python Infer下载地址:https://github.com/facebook/infer 配置环境变量 vi ~/.bash_profile #infer export PATH=${ ...

  8. 恶心的sbt 超级慢--解决

    最近在看sbt相关的资料.发现其构建仓库是用ivy和maven 相信使用过maven的人都知道下载 jar的过程十分痛苦(因为你穷,买不起VPN) 然后我们天朝本来有开源中国的maven库,后来又突然 ...

  9. Python将文本生成二维码

    #coding:utf-8 ''' Python生成二维码 v1.0 主要将文本生成二维码图片 测试一:将文本生成白底黑字的二维码图片 测试二:将文本生成带logo的二维码图片 ''' __autho ...

  10. 一篇不错的讲解Java异常的文章(转载)原作者已没法考证

    六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWriter ...