Session整理

简介:
在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值