声明:此篇文章为从网上下载的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.jsp,jerry.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>
<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>
<%
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>
<%
}
}
%>
<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是否被设置)
若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.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.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,如需转载请自行联系原作者