`

httpsession 详细内容整理

阅读更多

最近在做登录和权限控制模块,用到了session,发现session的好多方法都不熟悉,而且以前也听说过JsessionId 之类session窃取的事,对这些一直都是一知半解。今天索性google了很多资料,先上sun的官网去看session的文档了解一些方法,又找了别人关于session的看法。

总结如下:

      1,session是什么?  what

          session经常译为会话,以打电话为例,从开始拨号到挂断电话就是你会话的生存周期。

      2,session 做什么用的  why?

          首先举个例子:

                咖啡店举行 消费满5杯咖啡赠送一杯的活动,可每个人一次消费5杯的时候非常少。这时候有3种办法:

                1,店员看到每个顾客时都能记住其消费了多少杯,从而给其优惠,这是协议本身具有状态

                2,给每个顾客一个卡片,上面记录顾客的每次消费,这是客户端保存状态

                3,给每个顾客一个卡片,卡片上只有一个编号,顾客每次的消费记录在店里,这就是 服务端有状态

          而http本身是无状态的,所以我们只能使用2,3中方法,来保存一些信息。

          实际采用的是第3种方法,服务器段保存一次会话所有的信息,并生成一个唯一的id,这个id没有规律而且不会重复,将这个id传回到客户段,保存到cookie中。每次访问服务器时,客户端都会偷偷将这个id传到服务器,服务器根据id查到这次会话保存的内容。就能实现会话中共享一些数据。

     3,session怎样创建和销毁 ? how

         session是保存在内存中的,所以会有一些性能上的影响。因此本着这个原则,session是只有在使用到的时候才会被创建,如果始终没有用到session,这个session是永远不会被创建的。

        比如: 访问servlet ,只要你代码中没有 request.getSession()或request.getSession(true);这两行是等价的,那session是不会创建。又 当你访问静态页面时,根本不会生成servlet,所以也不会创建session。

       下面解释一些疑惑: session是第一次请求时创建的?

  大家都知道 jsp是被编译成servlet才执行的,问题就在jsp编译的过程。

 jsp中有个<%@ page session="true/false"%> 这个开关表示是否创建session,当你不写这行时,它会默认给你加上这句。所以会造成上面的疑惑。当然还有一些标签中可能有getSession()操作,会产生一些不必要的session。

       session只能在服务端销毁,有三种途径: 1,到达session的最大请求间隔时间时,2,session。invalidate()

 3,服务器进程当掉。

       这里也有一些疑惑: 浏览器关闭时,session就会注销。

       首先浏览器关闭时,浏览器并没有给服务器发送任何消息,所以服务器不会知道浏览器何时关闭了。

 上面我们知道取得session 是因为浏览器cookie中有sessionid,而普通cookie通常会是会话cookie,也就是说浏览器关闭时,这个cookie会被注销,所以当你再访问服务器时就没有sessionid了,所以造成session关闭了的假象,如果昵称通过特殊方法将sessionid传递给服务器,你会发现session还在。

如果想让cookie保存时间长一些,就需要手动指定cookie的过期时间

 

4,实际项目中的难点:

     1,浏览器禁用cookie

      这就没办法保存sessionid了,可以采用url重写,转发,加隐藏字段等方法来将sessionid传给服务器。

     如:  baidu.com:jsessionid=adfasdfasdfasdfasdfafdadf?asdfasdf

             baidu.com?jsessionid=asdfasdfasdfadsfad&&adfdf

 这根据服务器的不同实现,第一种可以将普通参数区分开。

 

     2,多人共用session的问题

        例: a 访问 baidu.com ,但他没有帐号,于是他将连接 baidu.com/login.jsp?jsessionid=adsfasdfad(这个a的sessionid) 发给B, B登录后,a就相当于用b的帐号登录了。你们可以在在本地试试。

        解决方法: 当发现通过sessionid从url指定时, 创建一个新的session,将旧session的信息复制到 新sessoin中,然后将新session注销。就能防止上面那种情况了。

    3,一个帐号多地方登录

       比如: 你用abc帐号登录了baidu.com,有打开了一个浏览器,又用abc帐号登录了一次。当不设计敏感操作时,这无所谓,而当你做一些敏感操作时就必须禁止这样情况,防止同时操作,造成重复操作,或者数据损坏。

     解决方法: 监听session,将username和sessionid对应起来,当username再次登录时,注销掉以前的session,保存现在的session,这也是一种比较不错的方案。

 

这是 sghcel 画的图,挺不错的:

分享到:
评论
32 楼 feiyan35488 2011-03-27  
sghcel 写道
最近学画图。把楼主的文章画成了图

图画的非常不错
31 楼 sghcel 2011-03-25  
最近学画图。把楼主的文章画成了图
30 楼 Technoboy 2011-03-23  
feiyan35488 写道
Aaron_Zhang 写道
feiyan35488 写道
qianshuiqs 写道
这个确实不错,但我还有一个问题,这个保存sessionId和username中的map必然是个全局对象,这个全局对象保存到哪里,还有之前说就算浏览器关闭了session也不会消失,那么如何从map中清理无用的session.

这个map可以保存到 servletContext中。清理session的时候,需要注册session的listener,有session销毁的操作时,就可以清除了。当对方关闭浏览器时,只能等session到期自动销毁。这就需要将session的最大请求间隔时间设计的合理一些

这个Map 要不要做成static的?

这个不用,放到servletContext中就可以了,用不到设计成static,否则需要用线程安全的map,这样查询和插入很浪费性能的


ServletContext是Servlet的上下文环境类,为什么要放到这里?
HttpSessionListener和HttpSessionActivationListener是监听Session对象的创建和销毁。当创建一个Session时,激发HttpSessionListener中的session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发HttpSessionListener中的sessionDestroyed (HttpSessionEvent se)方法。
所以说应该放到HttpSessionListener中。(用子类去实现这个接口,然后通过HttpSessionEvent.getSession().getId()去获得sessionId)

29 楼 feiyan35488 2011-03-22  
akunamotata 写道
引用

    1,浏览器禁用cookie
      这就没办法保存sessionid了,可以采用url重写,转发,加隐藏字段等方法来将sessionid传给服务器。
     如:  baidu.com:jsessionid=adfasdfasdfasdfasdfafdadf?asdfasdf
             baidu.com?jsessionid=asdfasdfasdfadsfad&&adfdf
这根据服务器的不同实现,第一种可以将普通参数区分开。


纠正
baidu.com;jsessionid=adfasdfasdfasdfasdfafdadf
而不是
baidu.com:jsessionid=adfasdfasdfasdfasdfafdadf

";"表示jsessionid作为uri请求的一部分信息
"?"不应该作为请求参数的一部分传递到服务端


嗯 对。
28 楼 akunamotata 2011-03-22  
引用

    1,浏览器禁用cookie
      这就没办法保存sessionid了,可以采用url重写,转发,加隐藏字段等方法来将sessionid传给服务器。
     如:  baidu.com:jsessionid=adfasdfasdfasdfasdfafdadf?asdfasdf
             baidu.com?jsessionid=asdfasdfasdfadsfad&&adfdf
这根据服务器的不同实现,第一种可以将普通参数区分开。


纠正
baidu.com;jsessionid=adfasdfasdfasdfasdfafdadf
而不是
baidu.com:jsessionid=adfasdfasdfasdfasdfafdadf

";"表示jsessionid作为uri请求的一部分信息
"?"不应该作为请求参数的一部分传递到服务端

27 楼 hejian811 2011-03-18  
好贴,session and cookie alwasy confused me.
26 楼 feiyan35488 2011-03-16  
Aaron_Zhang 写道
feiyan35488 写道
qianshuiqs 写道
这个确实不错,但我还有一个问题,这个保存sessionId和username中的map必然是个全局对象,这个全局对象保存到哪里,还有之前说就算浏览器关闭了session也不会消失,那么如何从map中清理无用的session.

这个map可以保存到 servletContext中。清理session的时候,需要注册session的listener,有session销毁的操作时,就可以清除了。当对方关闭浏览器时,只能等session到期自动销毁。这就需要将session的最大请求间隔时间设计的合理一些

这个Map 要不要做成static的?

这个不用,放到servletContext中就可以了,用不到设计成static,否则需要用线程安全的map,这样查询和插入很浪费性能的
25 楼 Aaron_Zhang 2011-03-16  
feiyan35488 写道
qianshuiqs 写道
这个确实不错,但我还有一个问题,这个保存sessionId和username中的map必然是个全局对象,这个全局对象保存到哪里,还有之前说就算浏览器关闭了session也不会消失,那么如何从map中清理无用的session.

这个map可以保存到 servletContext中。清理session的时候,需要注册session的listener,有session销毁的操作时,就可以清除了。当对方关闭浏览器时,只能等session到期自动销毁。这就需要将session的最大请求间隔时间设计的合理一些

这个Map 要不要做成static的?
24 楼 feiyan35488 2011-03-16  
accphc 写道
引用
解决方法: 当发现通过sessionid从url指定时, 创建一个新的session,将旧session的信息复制到 新sessoin中,然后将新session注销。就能防止上面那种情况了。

然后将新的session注销?!

笔误     将旧的session注销
23 楼 accphc 2011-03-16  
引用
解决方法: 当发现通过sessionid从url指定时, 创建一个新的session,将旧session的信息复制到 新sessoin中,然后将新session注销。就能防止上面那种情况了。

然后将新的session注销?!
22 楼 simple.liuyu 2011-03-16  
有学习了很多
21 楼 liuyuru 2011-03-16  
有些懂,有些还是不懂
20 楼 sdujq 2011-03-16  
非常感谢 最近正在做一个和权限有关的东西 学习到了……
19 楼 凤凰山 2011-03-16  
很不错!WWH的写作方式,赞
18 楼 sliverxxm 2011-03-16  
session这东西有时候真是让人很头疼的问题!
17 楼 cgz2909 2011-03-15  
不错,很实用
16 楼 javabkb 2011-03-15  
学习了,原来解决用户重复登录可以用这样的方法.
15 楼 竹隐江南 2011-03-15  
啊 我们项目也这样搞的。。。头疼的session。
14 楼 chan.d 2011-03-15  
qianshuiqs 写道
这个确实不错,但我还有一个问题,这个保存sessionId和username中的map必然是个全局对象,这个全局对象保存到哪里,还有之前说就算浏览器关闭了session也不会消失,那么如何从map中清理无用的session.


有一个叫监听器的东西
13 楼 feiyan35488 2011-03-15  
fenshen6046 写道
同问,除了设置session的过期时间有什么好办法来定期清理session么


目前没有非常好的解决办法,可以做些努力的操作是,在页面上注册 window.onclose 事件,当页面关闭时向服务器发送logout请求,就可以清理session了。至于直接kill 浏览器进程,没有解决办法。只能等待session自动销毁

相关推荐

    java个人基础列子整理

    在"javaMail和Servlet.rar"中,可能包含创建Servlet、处理GET和POST请求、转发和重定向、使用HttpSession以及实现Servlet生命周期方法(如init、service和destroy)的示例。学习Servlet有助于理解Web应用的后端逻辑...

    javaEE基础知识整理.pdf

    在Servlet中,我们可以使用HttpSession对象来跟踪会话,获取HttpSession对象,可以对其进行读和写操作,手工终止HttpSession对象或什么都不做。 MVC设计模式是JavaEE技术框架中的一个重要模式,它将应用程序分为...

    Java最全的面试整理

    以下是对这些知识点的详细解析: **69、forward 和 redirect 的区别** 在Java Web开发中,`forward`和`redirect`是两种常见的请求处理方式。 - `forward`(转发):在服务器端内部完成,不涉及客户端的重定向,...

    Javaweb期末复习考点整理以及期末考试复习题

    - `HttpSession`(session)对象:存储用户会话信息,`setAttribute()`和`getAttribute()`用于设置和获取共享数据。 - `ServletContext`(application)对象:代表整个Web应用的上下文,用于全局配置和共享数据。 ...

    自己整理2011实用JAVA面试题.doc

    - 在Action中可以直接向浏览器输出内容,但通常不推荐,因为这会破坏框架的正常流程,如果必须输出,需返回null并避免返回ActionForward对象。 - ActionMapping与Action的区别在于,Action是实际处理请求的类,而...

    jsp考试面试常见考点整理

    4. **HttpSession类的session对象**: - **作用**:用于跟踪用户会话的状态。 - **使用场景**:存储用户的登录状态或其他个性化信息。 5. **PageContext类的pageContext对象**: - **作用**:管理页面的上下文。...

    JSP中的内置对象详解[整理].pdf

    6. **out**对象:用于输出内容到响应流,相当于Servlet中的PrintWriter。例如,`out.println("Hello, World!");`会在页面上显示"Hello, World!"。 7. **config**对象:包含Servlet配置信息,通常在JSP页面初始化时...

    java工程师求职笔试题及答案.doc

    以上内容详细地介绍了Java工程师在求职过程中可能会遇到的一些基础知识和技术点,包括但不限于`HttpSession`的使用、GET与POST的区别、`&lt;jsp:useBean&gt;`标签的使用、Web应用的目录结构、三层架构的概念以及相关术语的...

    Java高阶框架面试题-含答案

    以下是对这些知识点的详细解释: 1. **SpringMVC工作流程**: - 用户发起HTTP请求到达DispatcherServlet(前端控制器)。 - DispatcherServlet调用HandlerMapping(处理器映射器)找到处理请求的Handler(处理器...

    《Web程序设计A》试卷A.doc

    以下是对这些知识点的详细说明: 1. **SQL语句与JDBC**: - 创建新闻表的SQL语句是:`CREATE TABLE news (id INT PRIMARY KEY AUTO_INCREMENT, title VARCHAR(50), content TEXT, author VARCHAR(20), pubtime ...

    Tomcat如何监控并删除超时Session详解

    做了一番整理。 注:空闲时间,指的是同一个会话两次请求之间的间隔时间 Session相关类图 HttpSession就是大家Servlet层可以直接使用的Session. Session是Tomcat内部使用的接口,可以做一些内部调用 ...

    韩顺平servlet教程视屏

    - **会话管理(Session Management)**:讲解如何利用HttpSession对象管理用户的会话状态。 ### 学习建议 - **动手实践**:理论知识固然重要,但更重要的是通过实际编码来加深理解。 - **参考官方文档**:遇到问题时...

    JavaWeb学习总结共9页.pdf.zip

    "JavaWeb学习总结共9页.pdf.zip"这个文件很可能是某位开发者或者教师整理的一份详尽的学习笔记,旨在帮助初学者或进阶者系统地理解和掌握JavaWeb的核心概念和技术。 首先,JavaWeb开发的基础是Java Servlet,它是...

    Java listener简介_动力节点Java学院整理

    Java Listener 是一种特殊的类,用于监听 ServletContext、HttpSession、ServletRequest 等域对象的创建、销毁、以及属性的变化等。监听器可以在事件发生前、发生后进行一些处理,例如统计用户在线人数。 监听器的...

    servlet之session简介_动力节点Java学院整理

    HttpSession session = request.getSession(); String data = "message form SessionDemo"; session.setAttribute("data", data); ``` 接着,当用户访问ServletDemo2时,同样的getSession()方法会被调用,但由于...

    SERVLET资源

    【描述】"我收集的一些有用的东西,打包发布"表明这些文档是由一位热心的IT从业者精心整理的,他/她将自己在学习和实践Servlet过程中积累的知识点和经验分享出来,供他人参考和学习,体现了IT社区的共享精神。...

    华为面试题集锦

    【华为面试题集锦】是针对求职者准备华为公司面试所整理的一份文档,涵盖了Java相关的面试题目。这些题目旨在测试求职者的编程基础、面向对象理解、异常处理、集合框架运用以及多线程和Web开发的基本知识。 1. **...

    JavaWeb实验.docx

    - 实验中并未详细描述,但通常会话技术涉及`HttpSession`接口,用于跟踪用户的会话状态。例如,可以通过创建session来保存用户的登录状态,即使在页面间跳转也能保持。 5. **Cookie实现自动登录**: - Cookie是一...

    Tomcat Servlet API

    【描述】"servlet的全部API文档整理"表明了这个资源包含了所有关于Servlet API的详细信息,包括类、接口、方法等,这对于开发者来说是极其宝贵的参考资料。Servlet API提供了与HTTP协议交互的接口和类,使得Java代码...

Global site tag (gtag.js) - Google Analytics