cookie的setMaxAge
程序员文章站
2022-11-01 08:09:43
实习工作当中一个问题,
具体环境:jsp, struts2, tomcat6
&n...
实习工作当中一个问题,
具体环境:jsp, struts2, tomcat6
问题:cookie的有效期限设置问题
正在做一个投票的东西, 但是要求每个主机对每一个投票只能进行一次投票, 尽量避免重复投票(但是这个要求并不是特别严格), 所以考虑用cookie实现, 尽量减少服务端的压力。
当一个主机第一次对这个投票进行投票之后, 提交的时候, 在代码里 新建一个cookie, 然后将cookie.setMaxAge设置为30天, 然后response到客户端, 当客户端再一次对这个投票活动进行投票的时候, 会附带着我在上面new 的cookie, 这样我就可以通过遍历所有的cookie然后取到我那个cookie, 然后验证此主机是否投过票。
问题出现了, 我设置的setMaxAge的值是30天, 但是当这个cookie再次回来的时候它的值变成了-1, 大家都知道默认都是-1, 而且这个代表的是一次会话, 跟session一样, 当会话结束后就会删除掉。
解决:可能的问题(代码、浏览器?、浏览器cookie设置问题?、)
首先看了下自己写的代码, 没问题。
再次进行debug, 发现还是-1。
有可能是换了火狐浏览器还是-1。(IE与火狐浏览器对session的误解:在下面细说。)
投票完毕之后关闭当前会话, 重新开启一个会话, 依然能够接收到我新建的cookie,maxAge也依然是-1。(我的maxAge设值成功, 也起效了)
查看J2EE文档, 上面写的很清楚, 我的就是用setMaxAge来进行设置。没办法,google一下, 类似问题不多, 但是有一些, 结果都是不了了之。google国外的网站, 也是不多, 但是也有一些, 结果都是一样没有答案。
个人猜想: 浏览器似乎对这个maxAge属性爱答不理的, 但它可以取到maxAge的值, 然后在浏览器内部对这个cookie设置过期时间(这个时间就是从maxAge取到的值), 然后当下次发送请求到服务器的时候, 它会把所有的cookie都附带上(可之前会取得path、domain属性, 然后判断是否发送)。 所谓的session在浏览器允许cookie的情况下, 一般多是采用cookie的形式("JSESSIONID", 唯一标示符)传送, 所以浏览器可能把所有的cookie都看成session, 默认赋将maxAge值成-1。
有过同样经历的人, 但有跟我不同见解的人希望说说。 (最好哪位大神, 会开发浏览器的, 还读过tomcat源码的人, 给指点下, 谢谢)
IE与火狐浏览器对session的误解:
我刚开始学习session的时候, 发现并不是像文档上说的那样, 一次会话最通俗的理解就是:一个浏览器页面打开以后的当前页面或者从当前页面衍生出来的页面与服务器的会话都是在一个会话范围内的。 因为IE、火狐、谷歌、 或者opera等其他浏览器是有些不同的, 有的时候从火狐页面发起一次会话, 然后关闭当前页面, 再重新打开一个新的页面发现, 还是上一个页面的会话范围(但是换做IE就不会这样)。很奇怪(原因: 火狐浏览器打开的那些页面其实都在一个进程内的, 所以当然属于一次会话, 但是如果杀死firefox.exe进程之后再重新打开一次会话, 就是不会出现上面的问题, 现在除了IE, 似乎大部分浏览器都采用这种方式, 火狐的页面我们全部关闭之后还会有一个界面, 这些页面似乎就是这个主界面的子页面, 所以session都是共享的, 其实应该都是共享主界面的吧?)
摘自 从此爱上蒲肉格蕾铭
具体环境:jsp, struts2, tomcat6
问题:cookie的有效期限设置问题
正在做一个投票的东西, 但是要求每个主机对每一个投票只能进行一次投票, 尽量避免重复投票(但是这个要求并不是特别严格), 所以考虑用cookie实现, 尽量减少服务端的压力。
当一个主机第一次对这个投票进行投票之后, 提交的时候, 在代码里 新建一个cookie, 然后将cookie.setMaxAge设置为30天, 然后response到客户端, 当客户端再一次对这个投票活动进行投票的时候, 会附带着我在上面new 的cookie, 这样我就可以通过遍历所有的cookie然后取到我那个cookie, 然后验证此主机是否投过票。
问题出现了, 我设置的setMaxAge的值是30天, 但是当这个cookie再次回来的时候它的值变成了-1, 大家都知道默认都是-1, 而且这个代表的是一次会话, 跟session一样, 当会话结束后就会删除掉。
解决:可能的问题(代码、浏览器?、浏览器cookie设置问题?、)
首先看了下自己写的代码, 没问题。
再次进行debug, 发现还是-1。
有可能是换了火狐浏览器还是-1。(IE与火狐浏览器对session的误解:在下面细说。)
投票完毕之后关闭当前会话, 重新开启一个会话, 依然能够接收到我新建的cookie,maxAge也依然是-1。(我的maxAge设值成功, 也起效了)
查看J2EE文档, 上面写的很清楚, 我的就是用setMaxAge来进行设置。没办法,google一下, 类似问题不多, 但是有一些, 结果都是不了了之。google国外的网站, 也是不多, 但是也有一些, 结果都是一样没有答案。
个人猜想: 浏览器似乎对这个maxAge属性爱答不理的, 但它可以取到maxAge的值, 然后在浏览器内部对这个cookie设置过期时间(这个时间就是从maxAge取到的值), 然后当下次发送请求到服务器的时候, 它会把所有的cookie都附带上(可之前会取得path、domain属性, 然后判断是否发送)。 所谓的session在浏览器允许cookie的情况下, 一般多是采用cookie的形式("JSESSIONID", 唯一标示符)传送, 所以浏览器可能把所有的cookie都看成session, 默认赋将maxAge值成-1。
有过同样经历的人, 但有跟我不同见解的人希望说说。 (最好哪位大神, 会开发浏览器的, 还读过tomcat源码的人, 给指点下, 谢谢)
IE与火狐浏览器对session的误解:
我刚开始学习session的时候, 发现并不是像文档上说的那样, 一次会话最通俗的理解就是:一个浏览器页面打开以后的当前页面或者从当前页面衍生出来的页面与服务器的会话都是在一个会话范围内的。 因为IE、火狐、谷歌、 或者opera等其他浏览器是有些不同的, 有的时候从火狐页面发起一次会话, 然后关闭当前页面, 再重新打开一个新的页面发现, 还是上一个页面的会话范围(但是换做IE就不会这样)。很奇怪(原因: 火狐浏览器打开的那些页面其实都在一个进程内的, 所以当然属于一次会话, 但是如果杀死firefox.exe进程之后再重新打开一次会话, 就是不会出现上面的问题, 现在除了IE, 似乎大部分浏览器都采用这种方式, 火狐的页面我们全部关闭之后还会有一个界面, 这些页面似乎就是这个主界面的子页面, 所以session都是共享的, 其实应该都是共享主界面的吧?)
摘自 从此爱上蒲肉格蕾铭