Session整理

来源:互联网 发布:数控折弯编程教学视频 编辑:程序博客网 时间:2024/06/05 05:10

简介:
在WEB开发中,服务器可以用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因而,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其他程序时,其他程序可以从用户的session中取出该用户的数据,为用户服务
Session和Cookie的区别
Cookie是把用户的数据写给用户的浏览器
Session技术是把用户的数据写给用户独占的session中
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象

Session实现原理
服务器是如何实现一个session为一个用户浏览器服务的?
服务器创建session出来后,会把session的id号,以cookie的形式写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来,就会使用内存中与之对应的session为之服务。

如果想要关掉浏览器再打开还可以使用同一个session,则需要给服务器回送的cookie设置有效时间(服务器自动回送的时候是没有有效期的)。具体做法是通过session对象的getId方法获得该session的id,然后创建一个cookie,该cookie的名字为”JSESSIONID”,值就是刚刚获得的id,再将该cookie设置下有效期,(也可以设置下Path),并添加到cookie中即可。但是有效期不得超过30分钟,因为浏览器关掉后,session只保存30分钟。

第一次访问时,服务器会创建个新的session,并且把session的id以cookie的形式发送给客户端浏览器

public class SessionDemo1 extends HttpServlet {       public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {       response.setCharacterEncoding("UTF=8");                              response.setContentType("text/html;charset=UTF-8");     //使用request对象的getSession()获取session,如果session不存在则创建一个          HttpSession session = request.getSession();//将数据存储到session中            session.setAttribute("data", "孤傲苍狼");//获取session的Id22              String sessionId = session.getId();//判断session是不是新创建的         if (session.isNew()) {                     response.getWriter().print("session创建成功,session的id是:"+sessionId);             }else {                 response.getWriter().print("服务器已经存在该session了,session的id是:"+sessionId);                        }            }          public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {               doGet(request, response);         }     }

点击刷新按钮,再次请求服务器,此时就可以看到浏览器再请求服务器时,会把存储到cookie中的session的Id一起传递给服务器端。

Session的常用方法

session的创建和获取
调用HttpServletRequest.getSession(true)这样的语句时session会被创建。
session的销毁
程序调用HttpSession.invalidate()
距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
服务器进程被停止
注意:关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。
session中方法分两大类
存取属性
其它方法

存取属性方法
getAttribute(String) 获取session中存储的信息
setAttribute(String,Object) 向session中添加信息
remove(String) 移除session中存储的信息

其它方法
void invalidate() 销毁session
String getId(): 取得session id
Long getCreationTime() 获取session的创建时间
Long getMaxInactiveInterval(): 最大不活动时间
void setMaxInactiveInterval(int)
Boolean isNew() 是否是新创建的session

session对象主要用于属性操作和会话管理,常用方法如下:

1.public void setAttribute(Sting name, Object value),设定指定名字的属性的值,并将它添加到session会话范围内,如果这个属性是会话范围内存在,则更改该属性的值。
2.public Object getAttribute(String name),在会话范围内获取指定名字的属性的值,返回值类型为object,如果该属性不存在,则返回null。
3.public void removeAttribute(String name),删除指定名字的session属性,若该属性不存在,则出现异常。
4.public void invalidate(),使session失效。可以立即使当前会话失效,原来会话中存储的所有对象都不能再被访问。

5.public String getId( ),获取当前的会话ID。每个会话在服务器端都存在一个唯一的标示sessionID,session对象发送到浏览器的唯一数据就是sessionID,它一般存储在cookie中。
6.public void setMaxInactiveInterval(int interval),设置会话的最大持续时间,单位是秒,负数表明会话永不失效。
7.public int getMaxInActiveInterval(),获取会话的最大持续时间。
8.使用session对象的getCreationTime()和getLastAccessedTime()方法可以获取会话创建的时间和最后访问的时间,但其返回值是毫秒,一般需要使用下面的转换来获取具体日期和时间。
Date creationTime = new Date(session.getCreationTime());
Date accessedTime = new Date(session.getLastAccessedTime());

案例:

<body>    <b>    会话ID:<%=session.getId() %> <br>    是否新会话:<%=session.isNew() %><br>    设置和获取属性对象:用户名 =    <%session.setAttribute("用户名","陈宁"); %>    <%=session.getAttribute("用户名") %><br>    <%    Date creationTime = new Date(session.getCreationTime());    Date accessedTime = new Date(session.getLastAccessedTime());     %>     会话创建时间:<%=creationTime %><br>     上次访问时间:<%=accessedTime %><br>     会话持续时间(s):<%=session.getMaxInactiveInterval() %><br>     <%session.setMaxInactiveInterval(12); %>     修改后的会话持续时间(s):<%=session.getMaxInactiveInterval() %><br>     <%session.invalidate(); %>     </b>  </body>

参考博客:
http://www.cnblogs.com/xdp-gacl/p/3855702.html
http://blog.csdn.net/eson_15/article/details/51261326