Jsp&Servlet之Session对象-阿里云开发者社区

开发者社区> 余二五> 正文

Jsp&Servlet之Session对象

简介:
+关注继续查看
声明:此篇文章为从网上下载的doc文档中的摘取,彩色部分为本人的笔记。
 
usession对象
HTTP协议是一种无状态的协议,客户向服务器发出请求,然后服务器返回响应(客户请求的页送至浏览器),连接就被关闭了,当下一次连接时,已经没有以前连接的信息了,无法判定本次连接和之前的连接是否来自于同一个客户。因此,为了保存来自同一客户的信息,可以使用session(会话)对象。
 
从打开浏览器请求服务器上的某个服务目录(一个Web应用程序的目录),到关闭浏览器离开服务器,称作一个 —— 会话(Session)。与此同时打开另外一个浏览器来发送请求,这将是另外一个会话(Session)。
 
客户可能会访问该服务目录中的多个页面,服务器通过客户的 session 对象就可以知道这是否是同一个客户,如果是,那么客户登陆一次就可以访问其它页面,而不必每个页面都登陆了。这些页面必须是同一客户窗口的(即各个页面是通过链接跳转的),如果是另外打开一个客户窗口必须重新登陆。
 
session的常用方法:
 
获取session ID
String getId()
sessionid.jsp
tom.jsp
jerry.jsp
判断是否是新的session
boolean isNew()
sessionnew.jsp
设置属性值
setAttribute(Stirng name,Object value)
login.jsp
welcom.jsp
获取属性值
Object getAttribute(String name)
删除属性值
removeAttribute(String name)
 
销毁session对象
invalidate()
logout.jsp
session的创建时间
long getCreationTime()
sessiontime.jsp
最后一次操作时间
long getLastAccessedTime()
 
session对象的ID
当首次请求服务器上的JSP页面时,服务器会生成一个session对象,具有一个服务器上唯一的ID号:session ID ,同时这个ID号会被发送到客户端,存放到客户的cookie中(前述例子cookie中的JSESSIONID即是)。
直到浏览器关闭,或是session对象达到了最大生存时间(一般30分钟),则该session对象失效。
 
例如:从sessionid.jsp出发,依此访问同一个站点的其它几个页面(tom.jspjerry.jsp),可以发现sessionID是一致的。
获取sessionID的方法,String session.getId(),得到的是132位的字符串。
InBlock.gifsession.jsp 
InBlock.gif<h1>获取SessionID: <%=session.getId() %></h1> 
InBlock.gif    
InBlock.gif<h1>连接到tom.jsp页面</h1> 
InBlock.gif  <form action="tom.jsp" method="post">     
InBlock.gif    <input type="submit" value="到tom.jsp">    
InBlock.gif  </form> 
 
InBlock.giftom.jsp 
InBlock.gif<% 
InBlock.gif      String sid = session.getId();        
InBlock.gif%> 
InBlock.gif    <h1> 
InBlock.gif      我是Tom页面,您在Tom页面中的session对象的ID是: 
InBlock.gif      <%= sid %> 
InBlock.gif    </h1> 
InBlock.gif        
InBlock.gif    <h1>点击超链接,连接到Jerry的页面:</h1> 
InBlock.gif        
InBlock.gif    <a href="jerry.jsp"> 欢迎到Jerry屋来! </a>    
 
session属性设置:
举例:假设用户输入的帐户信息为 admin/1234,则表示登陆成功,可以浏览welcome.jsp页面,否则不能浏览,需要再登陆。
2个页面:
login.jsp :表单,验证登陆
welcome.jsp:欢迎页,用户先登陆成功之后才可访问。
 
【分析】:
可以利用session传递一个标识属性(flag)来判定用户是否成功登陆了:
² 如果登陆验证成功,则使用:
session.setAttribute(“flag”,”OK”) 设置标识属性flag
² welcome.jsp页面,根据属性flag是否有值,即可知道之前是否登陆过了:
if( session.getAttribute(“flag”)!=null )  则可以访问welcome页面,否则转回登陆页面。
InBlock.giflogin.jsp 
InBlock.gif<form action="login.jsp" method="post"
InBlock.gif          账号:<input type="text" name="uname"><br> 
InBlock.gif          密码:<input type="password" name="upw"><br> 
InBlock.gif          <input type="submit" value="登    陆">            
InBlock.gif        </form> 
InBlock.gif         
InBlock.gif        <% 
InBlock.gif          if(request.getParameter("uname") != null && request.getParameter("upw") !=null){    
InBlock.gif            
InBlock.gif            String name = request.getParameter("uname"); 
InBlock.gif            String pw = request.getParameter("upw");            
InBlock.gif            
InBlock.gif            if(name.equals("admin")&& pw.equals("1234")){ 
InBlock.gif             
InBlock.gif            //若用户成功登陆,则设置flag属性值为OK 
InBlock.gif            //则在欢迎页上,根据属性flag值的判定,可以知道用户是否登陆成功了 
InBlock.gif             
InBlock.gif              session.setAttribute("flag","OK"); 
InBlock.gif                
InBlock.gif              //可以利用session把用户名传递给欢迎页 
InBlock.gif              session.setAttribute("uname",name); 
InBlock.gif             
InBlock.gif            //登陆成功后,跳转至欢迎页 
InBlock.gif              response.sendRedirect("welcome.jsp"); 
InBlock.gif             
InBlock.gif            }else{            
InBlock.gif        %> 
InBlock.gif          <h1>登陆失败!</h1> 
InBlock.gif        <% 
InBlock.gif            } 
InBlock.gif          } 
InBlock.gif        %> 
 
InBlock.gifwelcome.jsp 
InBlock.gif<%-- 欢迎页:先判定用户是否已经成功登陆(根据属性flag是否被设置) 
InBlock.gif             
InBlock.gif            若flag有值,说明登陆验证是成功的,则显示欢迎消息 
InBlock.gif             
InBlock.gif            否则,3秒钟后转回 login.jsp页 
InBlock.gif             
InBlock.gif     --%> 
InBlock.gif 
InBlock.gif<%    
InBlock.gif          if(session.getAttribute("flag")!= null){ 
InBlock.gif %> 
InBlock.gif          <h1>欢迎<%= (String)session.getAttribute("uname") %>光临!</h1> 
InBlock.gif <% 
InBlock.gif          }else{            
InBlock.gif %>         
InBlock.gif            <h1>您还未登陆,请登陆后再访问!</h1>             
InBlock.gif <% 
InBlock.gif          response.setHeader("refresh","3;url=login.jsp"); 
InBlock.gif          } 
InBlock.gif %> 
 
【注】不要去判断 flag的值是否为”OK”,如果没有通过登陆验证的话,根本不会有flag属性值传到welcome页面,session.getAttribute("flag")的结果会是null,无法进行字符串的比对。
 
注销:让用户的session失效
若希望在session生存时间到达之前释放session的资源,则可以手动销毁session对象,采用方法:invalidate() 
InBlock.gif例如:注销页logout.jsp, 
InBlock.gif 
InBlock.gif<% 
InBlock.gif          session.invalidate(); 
InBlock.gif%> 
InBlock.gif <a href="welcome.jsp">转去欢迎页</a> 
 
session的时间相关:
创建session的时间:客户浏览器第一次访问服务目录上的页的时间
最后一次操作的时间:最近一次访问服务目录上的页的时间
【返回的时间是个自197011日以来的毫秒数,long型,需要用new Date(long time) 构造成为日期形式的时间】
大约计算客户的在线时间:getLastAccessedTime() - getCreationTime()
InBlock.gifsessiontime.jsp 
InBlock.gif<%    
InBlock.gif      //session.getCreationTime()获取session的创建时间 
InBlock.gif      //session.getLastAccessedTime()获取最后一次操作的时间 
InBlock.gif      long l1 = session.getCreationTime(); 
InBlock.gif      long l2 = session.getLastAccessedTime(); 
InBlock.gif    %> 
InBlock.gif    <h1> 
InBlock.gif      session创建时间:<%=new Date(l1)%>        
InBlock.gif    </h1> 
InBlock.gif    <h1> 
InBlock.gif      session最后一次操作时间<%=new Date(l2)%> 
InBlock.gif    </h1> 
InBlock.gif    <h1> 
InBlock.gif      用户在线时间:<%=(l2 - l1) / 1000%> 秒 
InBlock.gif    </h1> 
InBlock.gif     
InBlock.gif    <h1>session生存时间:<%= session.getMaxInactiveInterval() %></h1> 
 
备注:
问题:session的创建过程?sessionId在服务器和客户端都保存吗?
解答:当首次请求服务器上的JSP页面时,服务器会生成一个session对象,具有一个服务器上唯一的ID号:session ID ,同时这个ID号会被发送到客户端,存放到客户的cookie中。
 
Session是服务器端创建的,cookie是客户端创建的。
Session两种实现:
1cookie
2URL重写
如果浏览器支持cookie,创建session的时候会把创建的sessionId保存在cookie中。如果不支持cookie,必须自己编程使用URL重写的方式实现Session:
response.encodeURL()
² 转码
    ² URL后面加入sessionID









本文转自 yzzh9 51CTO博客,原文链接:http://blog.51cto.com/java999/163806,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
02_spring_ioc| 学习笔记
快速学习02_spring_ioc
3 0
我的无影云电脑初体验
最近看到阿里云开发者社区有无影云电脑的体验活动,遂报名体验。 由于在阿里云开发者社区是专家博主,有幸获得一年的 4核 8G 无影云电脑的体验机会。 试用了几天,下面从无影云电脑的用户群体、无影云电脑的使用场景,我的使用感受,目前还存在的问题等方面,简单谈谈自己的感受。
13 0
03_spring_ioc 实现| 学习笔记
快速学习03_spring_ioc 实现
3 0
《冬季实战营第一期:从零到一上手玩转云服务器》实践报告
在大数据时代,制作个人网站,学会ECS云服务器是必要之选。 本文主要说明第一期冬季实战营ECS云服务器实践目的,实践步骤以及实践成果。完成门户网站的搭建,可以根据公司的需求自定义门户网站的内容。
6 0
大学生第一次使用阿里云的感受
阿里云、服务器、tomcat、xshell
5 0
06_spring_ 依赖注入| 学习笔记
快速学习 06_spring_ 依赖注入
8 0
【冬季实战营第一期:从零到一上手玩转云服务器】学习报告
这篇内容主要是描述了我在学习实战营第一期课程中遇到的问题和部分解决方案。 注:为了复现问题,因此多次体验并截图,因此可能存在前后图片中账号不一致的问题。不过描述的问题是确实存在的。
8 0
05_spring_ 配置文件| 学习笔记
快速学习05_spring_ 配置文件
5 0
04_spring_ioc 创建对象的方式| 学习笔记
快速学习 04_spring_ioc 创建对象的方式
4 0
初始ECS
物联网学习的硬性需求,我们需要搭建一台自己的服务器,在不断查找资料和方法后,获知阿里云ECS云服务器有学生体验资格,继而我将利用ECS云服务器搭建一个自己的EMQX服务器端。
17 0
+关注
20382
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载