> 文章列表 > 关于B/S结构系统的会话机制(session机制)

关于B/S结构系统的会话机制(session机制)

关于B/S结构系统的会话机制(session机制)

会话对应的英语单词是"session"

对会话的理解:

        1.用户打开浏览器,进行一系列操作,然后最终将浏览器关闭,这整个过程叫做"一次会话"。

        2.会话在服务器端有一个对应的java对象,这个java对象叫做"session"。

        3.一个会话当中包含多次请求。(一次会话对应N次请求。)

                解释一下什么是一次请求:用户在浏览器上点击了一下(一般是超链接),直到页面停下来,可以粗略认为是一次请求。请求对应的服务器端的java对象是request。

                提问:上面的解释中为什么说粗略认为呢?

                        回答:在一次请求当中servlet里可能会使用请求转发调用另外的资源,请求转发属于一次请求,所以我们称为一次请求是对的;但是在servlet中也可能使用重定向来调用其他资源,重定向属于二次请求,为此我们称为一次请求就不准确了,所以我们上面的解释中才用了"粗略认为"这几个字.

        4.在java的servlet规范当中,session对应的类名:HttpSession(jarkata.servlet.http.HttpSession)

        5.session机制属于B/S结构的一部分。如果使用php语言开发WEB项目,同样也是有session这种机制的。session机制实际上是一个规范。不同的语言都对这种会话机制进行了实现。

        6.session对象最主要的作用是:保存会话状态。(用户登录成功了,这是一种登录成功的状态,你怎么把登录成功的状态一直保存下来呢?使用session对象可以保留会话状态。)

提问:为什么需要session对象来保存登录状态,而不使用request对象或ServletContext对象保存登录状态?

        回答:具体原因如下:

                1.因为HTTP协议是一种无状态协议。

                        什么是无状态:请求的时候,B和S是连接的,但是请求结束之后,连接就断了。为什么要这么做?HTTP协议为什么要设计成这样?因为这样的无状态协议,可以降低服务器的压力。请求的瞬间是连接的,请求结束之后,连接断开,这样服务器压力小。

                2.只要浏览器(B)和服务器(S)断开了,那么关闭浏览器这个动作,服务器是不知道的.

                3.举例:张三打开一个浏览器A,李四打开一个浏览器B,访问服务器之后,在服务器端会生成两个session对象它们分别是:

                        张三专属的session对象

                        李四专属的session对象

                4.request是一次请求一个对象。生命周期太短,每次请求都是新的请求对象,不适合.

ServletContext对象是服务器启动的时候创建,服务器关闭的时候销毁,这个ServletContext对象只有一个。如果使用ServletContext对象来保存,就会出现前一个用户登录后,后面其他任意一个用户来访问都不需要登录的情况.

                5.综合以上多种原因,我们需要使用session对象来保存.

 

session对象的实现原理如下图:             

关闭浏览器会导致浏览器缓存消失从而导致cookie消失,为此浏览器中sessionid也会消失,会话等同于结束。

提问:cookie禁用了,session还能找到吗?

        回答:cookie禁用是什么意思?服务器正常发送cookie给浏览器,但是浏览器不要了。拒收了。并不是服务器不发了。为此就找不到session的id了,这样每一次请求都是新请求,都会重新获取到新的session对象。

提问:cookie禁用了,session机制还能实现吗?

        回答:可以。但是需要使用URL重写机制。举例如下:分号前面是访问路径+资源;分号后面sessionid名=session值

http://localhost:8080/servlet12/test/session;jsessionid=19D1C99560DCBF84839FA43D58F56E16

 

URL重写机制会提高开发者的成本。开发人员在编写任何请求路径的时候,后面都要添加一个sessionid,给开发带来了很大的难度,很大的成本。所以大部分的网站都是这样设计的:你要是禁用cookie,你就别用了。

总结一下到目前位置我们所了解的域对象:

        request(对应的类名:HttpServletRequest)        请求域(请求级别的)

        session(对应的类名:HttpSession)                    会话域(用户级别的)

        application(对应的类名:ServletContext)           应用域(项目级别的,所有用户共享的。)

        这三个域对象的作用范围大小关系是:

                request < session < application

        三个域对象都有以下三个公共的方法:

                setAttribute(向域当中绑定数据)

                getAttribute(从域当中获取数据)

                removeAttribute(删除域当中的数据)

        使用原则:尽量使用小的域。

 

提问:session掌握之后,我们怎么解决oa项目中的登录问题,怎么能让登录起作用。

        回答:登录成功之后,可以将用户的登录信息存储到session当中。也就是说session中如果有用户的信息就代表用户登录成功了。session中没有用户信息,表示用户没有登录过。则跳转到登录页面。

销毁session对象的方法是:session.invalidate();