Jsp&Servlet之Session对象

简介:
声明:此篇文章为从网上下载的doc文档中的摘取,彩色部分为本人的笔记。
 
u session对象
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() ,得到的是 1 32 位的字符串。
session.jsp 
<h1>获取SessionID: <%=session.getId() %></h1> 
    
<h1>连接到tom.jsp页面</h1> 
  <form action= "tom.jsp" method= "post">     
    <input type= "submit" value= "到tom.jsp">    
  </form> 
 
tom.jsp 
<% 
      String sid = session.getId();        
%> 
    <h1> 
      我是Tom页面,您在Tom页面中的session对象的ID是: 
      <%= sid %> 
    </h1> 
        
    <h1>点击超链接,连接到Jerry的页面:</h1> 
        
    <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 页面,否则转回登陆页面。
login.jsp 
<form action= "login.jsp" method= "post"
          账号:<input type= "text" name= "uname"><br> 
          密码:<input type= "password" name= "upw"><br> 
          <input type= "submit" value= "登    陆">            
        </form> 
         
        <% 
           if(request.getParameter( "uname") !=  null && request.getParameter( "upw") != null){    
            
            String name = request.getParameter( "uname"); 
            String pw = request.getParameter( "upw");            
            
             if(name.equals( "admin")&& pw.equals( "1234")){ 
             
             //若用户成功登陆,则设置flag属性值为OK 
             //则在欢迎页上,根据属性flag值的判定,可以知道用户是否登陆成功了 
             
              session.setAttribute( "flag", "OK"); 
                
               //可以利用session把用户名传递给欢迎页 
              session.setAttribute( "uname",name); 
             
             //登陆成功后,跳转至欢迎页 
              response.sendRedirect( "welcome.jsp"); 
             
            } else{            
        %> 
          <h1>登陆失败!</h1> 
        <% 
            } 
          } 
        %> 
 
welcome.jsp 
<%-- 欢迎页:先判定用户是否已经成功登陆(根据属性flag是否被设置) 
             
            若flag有值,说明登陆验证是成功的,则显示欢迎消息 
             
            否则,3秒钟后转回 login.jsp页 
             
     --%> 
 
<%    
           if(session.getAttribute( "flag")!=  null){ 
 %> 
          <h1>欢迎<%= (String)session.getAttribute( "uname") %>光临!</h1> 
 <% 
          } else{            
 %>         
            <h1>您还未登陆,请登陆后再访问!</h1>             
 <% 
          response.setHeader( "refresh", "3;url=login.jsp"); 
          } 
 %> 
 
【注】不要去判断  flag 的值是否为 ”OK” ,如果没有通过登陆验证的话,根本不会有 flag 属性值传到 welcome 页面, session.getAttribute( "flag" ) 的结果会是 null ,无法进行字符串的比对。
 
注销:让用户的session失效
若希望在 session 生存时间到达之前释放 session 的资源,则可以手动销毁 session 对象,采用方法: invalidate () 
例如:注销页logout.jsp, 
 
<% 
          session.invalidate(); 
%> 
 <a href= "welcome.jsp">转去欢迎页</a> 
 
session的时间相关:
创建 session 的时间:客户浏览器第一次访问服务目录上的页的时间
最后一次操作的时间:最近一次访问服务目录上的页的时间
【返回的时间是个自 1970 1 1 日以来的毫秒数, long 型,需要用 new Date(long time)  构造成为日期形式的时间】
大约计算客户的在线时间: getLastAccessedTime() - getCreationTime()
sessiontime.jsp 
<%    
       //session.getCreationTime()获取session的创建时间 
       //session.getLastAccessedTime()获取最后一次操作的时间 
       long l1 = session.getCreationTime(); 
       long l2 = session.getLastAccessedTime(); 
    %> 
    <h1> 
      session创建时间:<%= new Date(l1)%>        
    </h1> 
    <h1> 
      session最后一次操作时间<%= new Date(l2)%> 
    </h1> 
    <h1> 
      用户在线时间:<%=(l2 - l1) / 1000%> 秒 
    </h1> 
     
    <h1>session生存时间:<%= session.getMaxInactiveInterval() %></h1> 
 
备注:
问题: session 的创建过程? sessionId 在服务器和客户端都保存吗?
解答:当首次请求服务器上的 JSP 页面时,服务器会生成一个 session 对象,具有一个服务器上唯一的 ID 号: session ID  ,同时这个 ID 号会被发送到客户端,存放到客户的 cookie 中。
 
Session 是服务器端创建的, cookie 是客户端创建的。
Session 两种实现:
1 cookie
2 URL 重写
如果浏览器支持 cookie ,创建 session 的时候会把创建的 sessionId 保存在 cookie 中。如果不支持 cookie ,必须自己编程使用 URL 重写的方式实现 Session:
response.encodeURL()
²  转码
    ² URL 后面加入 sessionID









本文转自 yzzh9 51CTO博客,原文链接:http://blog.51cto.com/java999/163806,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
61 0
|
1月前
|
缓存 Java Spring
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。
134 3
servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header
|
3月前
|
SQL Java 数据库
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
该博客文章介绍了在JSP应用中使用Servlet查询SQL Server数据库的表信息,并通过JavaBean封装图书信息,将查询结果展示在Web页面上的方法。
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
|
2月前
|
存储 安全 搜索推荐
探索研究Servlet Session 跟踪
【9月更文挑战第27天】
18 0
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
32 3
|
3月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
31 1
|
3月前
|
供应链 前端开发 Java
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)
这篇文章通过一个服装库存管理系统的实例,展示了在Spring Boot项目中使用Ajax、JSON、layui、MVC架构和iframe等技术,涵盖了注册登录、权限管理、用户管理、库存管理等功能,并提供了系统运行环境和技术要求的详细说明。
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)
|
3月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
41 0
|
3月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
28 0
|
4月前
|
XML Java 数据格式
jsp和servlet有什么区别?
总的来说,JSP和Servlet都是创建动态Web应用程序的重要工具,但它们的使用依赖于特定的需求和上下文。
38 0