session对象是javax.servlet.http.HttpSession接口的实例,但是不像HttpServletRequest或HttpServletResponse一样,有父接口,他没有父接口。
HttpSession接口的主要方法:
1. java.lang.String getId():取得session ID
2. long getCreationTime():取得session的创建时间
3. long getLastAccessedTime():取得session的最后一次操作时间
4. boolean isNew():判断是否新的session(新用户)
5. void invalidate():让session失效
6. java.util.Enumeration<java.lang.String> getAttributeNames():得到全部属性的名称
在整个session中, 最重要的部分 就是属性的操作,可是对于属性的操作除了之前的setAttribute(), getAttribute(),removeAttribute()以外,有个getValue(),putValue()都是deprecated。不建议使用,过时的。
- session ID
对于每个用户来说,都表示一个不同的session,服务器就是靠session id来区分每个用户的,每个通过浏览器连接到服务器上的用户都会服务器自动分配一个唯一的session id。
例子:
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <% String id = session.getId() ; %> <h3>SESSION ID:<%=id%></h3> <h3>SESSION ID长度:<%=id.length()%></h3> </body> </html>
每个连接到服务器上的session id是不同的,通过浏览器区分。
但是需要注意,对于id的操作不是成对的。因为正常都是先有set方法再有get方法。
可以发现,之前的cookie自动设置的那个cookie就是每个用户的session id,如果关闭服务器,session id会重新分配。
原本的session id不保留,服务器关闭后,session id就没了。如果现在用户要求即使关闭服务器,也要保留session
id的话,需要用到序列化的机制。
所谓的对象序列化,指的是一个对象通过二进制保存或者进行传输,而且对象所在的类必须实现java.io.Serializable接口,对于session本身也需要完成这种序列化的操作,但是不是手工完成的,是需要自动配置完成,在tomcatconfserver.xml里:
<Context path="/wly" docBase="D:Workspace" reloadable="true">
</Context>
中间加入以下内容后,服务器即便关闭,session id会保存,而且会保留在d: emp里一个序列化文件:
<Manager className="org.apache.catalina.session.PersistentManager"> debug=0 saveOnRestart="true" maxActiveSession="-1" minIdleSwap="-1" maxIdleSwap="-1" maxIdleBackup="-1" <Store className="org.apache.catalina.session.FileStore" directory="d: emp"/> </Manager>
- 登录及注销
login.jsp:
自提交考虑空的问题;
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <form action="login.jsp" method="post"> 用户名:<input type="text" name="uname"><br> 密 码:<input type="password" name="upass"><br> <input type="submit" value="登陆"> <input type="reset" value="重置"> </form> <% // 直接通过一个固定的用户名和密码 String name = request.getParameter("uname") ; String password = request.getParameter("upass") ; if(!(name==null || "".equals(name) || password==null || "".equals(password))){ if("lixinghua".equals(name) && "mldn".equals(password)){ // 如果登陆成功,则设置session属性范围。 session.setAttribute("userid",name) ; response.setHeader("refresh","2;URL=welcome.jsp") ; %> <h3>用户登陆成功,两秒后跳转到欢迎页!</h3> <h3>如果没有跳转,请按<a href="welcome.jsp">这里</a>!</h3> <% } else { %> <h3>错误的用户名或密码!</h3> <% } } %> </body> </html>
welcome.jsp:
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <% // 如果已经设置过了session属性,则肯定不为空 if(session.getAttribute("userid")!=null){ %> <h3>欢迎<%=session.getAttribute("userid")%>光临本系统,<a href="logout.jsp">注销</a></h3> <% } else { // 没有session,则应该给出提示,先去登陆 %> <h3>请先进行系统的<a href="login.jsp">登陆</a>!</h3> <% } %> </body> </html>
logout.jsp:
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <% response.setHeader("refresh","2;URL=login.jsp") ; session.invalidate() ; // 注销,表示当前的session失效 %> <h3>您已成功退出本系统,两秒后跳转回首页!</h3> <h3>如果没有跳转,请按<a href="login.jsp">这里</a>!</h3> </body> </html>
以上做法是属于session使用最多的一种登录验证的操作,除此之外还有4种技术
1. 通过session保存的方法
2. 通过cookie
3. 通过表单的隐藏域完成
4. 通过地址重写
以后本书的struts讲解这块,很多时候都通过地址重写的方式进行。
- 判断新用户
在session对象中可以用isNew()方法来判断一个用户是否是第一次访问页面
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <% if(session.isNew()){ %> <h3>欢迎新用户光临!</h3> <% } else { %> <h3>您已经是老用户了!</h3> <% } %> </body> </html>
运行时,因为服务器已经设定cookie了,重新打开一个浏览器,才是新用户。
- 取得用户操作时间
要想取得一个session的具体操作时间,可以通过计算来获得。
getLastAccessedTime()-getCreationTime()
<%@ page contentType="text/html" pageEncoding="GBK"%> <html> <head><title>www.mldnjava.cn,MLDN高端Java培训</title></head> <body> <% long start = session.getCreationTime() ; long end = session.getLastAccessedTime() ; long time = (end - start) / 1000 ; %> <h3>您已经停留了<%=time%>秒!</h3> </body> </html>
session的登录和注销最重要:setAttribute() , getAttribute(),invalidate();
每一个session id就表示一个用户。