Session

来源:互联网 发布:上海国金网络朱文君 编辑:程序博客网 时间:2024/05/01 12:22

一HttpSession概述

1.1什么是HttpSession

        HttpSession接口表示一个会话。注意,一个浏览器独占一个Session对象(默认情况下),因此需要保存数据时,可以把数据保存在浏览器独占的Session中,当用户使用浏览器访问其它程序时,其它程序可以从Session中取出数据,为用户服务。


1.2获取HttpSession对象

        *****HttpSession request.getSession();

                方法介绍:如果当前会话中,已经有了Session对象,则直接返回Session对象,如果不存在,那么创建Session对象,并返回。

        *****HttpSession request.getSession(boolean);

                方法介绍:当参数为true时,如果当前会话中存在Session对象,那么直接返回Session对象,如果没有则创建Session对象,并返回,即和上面的方法一样;如果参数为false,如果当前会话中存在Session对象,那么直接返回Session对象,如果不存在,则返回null;


1.3HttpSession是域对象

        javaweb中一共有四个域对象,其中Servlet可以使用其中的三个:request, session, ServletContext,jsp还可以使用PageContext。

        HttpSession域对象方法介绍

                *****void setAttribute(String name, Object value)

                方法介绍:用来存储一个对象,也可以称之为存储一个域属性,例如:session.setAttribute(“xxx”, “XXX”),在session中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;


                *****Object getAttribute(String name)

                方法介绍:用来获取session中的数据,当前在获取之前需要先去存储才行,例如:

String value = (String) session.getAttribute(“xxx”);,获取名为xxx的域属性;

                *****void removeAttribute(String name)

                方法介绍:用来移除HttpSession中的域属性,如果参数name指定的域属性不存在,那本方法什么都不做;

                *****Enumeration getAttributeNames()

                方法介绍:获取所有域属性的名称;


二Session的实现原理

        Session的低层是依赖Cookie的,下面我们来理解一下Session的实现原理。

        我们先来看个故事。我们是如何实现在银行存钱这件事的?银行怎么知道在它那的钱属于谁?

        当我们第一次去银行的时候,因为还没有账号,所以我们需要开户,这时我们获取的是银行卡(上面有账号),而银行这边在数据库中留下了我的账号,我的钱保存在银行的账号中,而我带走的是银行卡(账号)。

        当我们下次再去银行的时候,带上我们的银行卡,银行就知道了我的账号,而无需再开卡,也不会弄错。

        对于Session呢?

        当我们首次使用Session时,服务器会创建Session,Session是保存在服务器端,而给客服的是Session的ID(通过Cookie来给),客服端带走的是sessionId,而数据保存在Session中。

        当下次再访问服务器的时候,只需要带上sessionId,而服务器就能够根据这个sessionId来找到对应的Session,而无需重新创建Session。


三Session与浏览器

        Session保存在服务器,而SessionID通过Cookie发送给客服端,但如果没有设置Cookie的生命的话,Cookie的默认只在浏览器内存内存在,即,一旦关闭浏览器,Cookie也就消失了。

        当用户再次打给浏览器进行访问,这时,就不会Session发给服务器,服务器就会认为你没有Session,就会重新创建一个新的Session。并把SessionID通过Cookie发给客服端。

        你很可能会问,那原来那个Session会怎么办呢,对于原来的那个Session,服务器会发现这个Session很久没人用,就会把它给删了。这个时长在tomcat中配置的时间是30分钟,也可以自己修改配置延迟或缩短时间,在/conf/web.xml中进行配置,也可以在自己的web工程的web.xml中进行配置。示例如下:

<session-config>  <session-timeout>30</session-timeout>  </session-config>


四Session其它常用API

        *****String getId()

                方法介绍:获取sessionId;

        *****int getMaxInactivelnterval();

                方法介绍:获取Session可以的最大不活动时间,默认情况下是30分钟,当Session在30分钟内没有被使用,那么comcat会在Session池移除这个Session。

        *****void setMaxInactiveInterval(int interval)

                方法介绍:设置Session允许的最大不活动时间(单位为妙),如果设置时间为1秒钟,那么只要Session在1秒

钟内没有被使用,那么Session就会被移除。

        *****long getCreateTime()

                方法介绍:返回Session的创建时间,返回值为当前时间的毫秒值;

        *****long getLastAccessedTime()

                方法介绍:返回Session的最后活动时间,放回值为当前时间的毫秒值;

        *****void invalidate()

                方法介绍:让Session失效!调用这个方法会让Session失效,当Session失效后,客服端再次请求,

服务器会为客服端创建一个新的Session,并在响应中给客服端新Session的sessionId;

        *****boolean isNew()

                方法介绍:查看Session是否为新的Session。当客服端第一次请求时,服务器为客服端创建Session,但这

时还没有响应给客服端,也就是没有把sessionId响应给客服端,这时Session的状态为新。


五URL重写

        我们知道Session依赖Cookie,为Session会依赖Cookie呢,因为服务器需要在每次请求中获取sessionId,然后找到对应的客服端的Session。但如果在没有设置Cookie的生命的情况下,浏览器关闭了怎么办?你肯定会说那可以设置Cookie的生命,把Cookie保存到了硬盘上,那如果浏览器禁用了Cookie呢?

        其实这个时候我们还有一种技术可以使服务器得到客服端的sessionId,那就是URL重写。在每个页面中的链接和表单后面加上名为jSessionId的参数,值为当前的sessionId,这样,当通过点击链接或提交表单时,服务器就可以根据jSessionId这个参数来得到sessionId,从而找到Session。

        在链接和表单中添加jSessionId的方法

        链接:<a href="/javawebname/xxx;jSessionId=当前sessionId值"></a>

        表单:<form action="/javawebname/xxx;jSessionId=当前sessionId值" method="get"></form>

        特别需要注意的是:通过这种方式进行URL重写,加上jSessionId这个参数时,不是用&而是用;(分号)。

        如果觉得上述方式比较麻烦,也可以使用response.encodeUrl(String url),对每个请求的url进行处理,这个方法会自动追加jSessionId参数,与上述方法功能一样。

        而且这个方法还非常智能,它会自动判断,当前浏览器是否禁用了Cookie,如果检测到禁用了Cookie会自动在每个请求的URl后面添加jSessionId参数,如果没有禁用Cookie,就不会添加jSessionId这个参数。

0 0
原创粉丝点击