1,什么是session?
实际开发中session对象最主要的用处就是完成用户的登录和注销等常见功能;每一个session都代表不同的用户;
session对象是javax.servlet.http.HttpSession接口的实例化对象,所以session只能在Http协议中使用;它的常用方法如下:
NO | 方法 | 类型 | 描述 |
1 | public String getId() | 普通 | 取得session id |
2 | public long getCreationTime() | 普通 | 取得session的创建时间 |
3 | public long getLastAccessedTime() | 普通 | 取得session的最后一次操作时间 |
4 | public boolean isNew() | 普通 | 判断是否是新的session(新用户) |
5 | public void invalidate() | 普通 | 让session失效 |
6 | public Enumeration getAttributeNames() | 普通 | 得到全部属性的名称 |
在HttpSession接口中最重要的部分还是属性操作,主要是可以完成用户登录的合法性验证;
2,取得session Id
当一个用户连接到服务器后,服务器会自动为此session分配一个不会重复的session Id,服务器依靠这些不同的session Id来区分每一个不同的用户,可以使用HttpSession接口中的getId()方法取得这些编号!
<% String id = session.getId(); %> Session ID:<%=id %><br /> session ID Length:<%= id.length() %><br />
输出结果是:
Session ID:6111EC4EBBDDC1DFABD9BBB81EBD20CB
session ID Length:32
这里的sessionId和cookie的JSESSIONID用处是一样的,为了区分,在使用session操作时实际上都使用了Cookie的处理机制,即在客户端的Cookie中保存每一个session Id,这样用户在每次发出请求时都会将此Session id发送到服务器端,服务器依靠此Session id区分每一个不同的客户端;
在使用session时,要注意:对于每一个已连接到服务器上的用户,如果重新启动服务器,则这些用户再次发出请求实际上表示的都是一个新连接的用户,服务器会为每个用户重新分配一个新的session Id。
3,使用session
session是否可以在服务器重启后继续使用?在应用中,如果服务器重新启动,则已经分配的session Id就会消失,那么如何才能让这些session继续保存,等待服务器重新启动后继续使用呢?可以通过序列化的方式保存session继续使用,在tomcat服务器里可以通过配置server.xml文件,将每一个用户的session在服务器关闭时序列化到存储介质中(数据库也可,文件也可)这样即使服务器重新启动,也可以通过反序列化的方式,从指定的存储介质上反序裂化session;
配置server.xml:
<Context path="/keith" docBase="/home/keith"> <Manager className="org.apache.catalina.PersistentManager"> debug=0 saveOnRestart="true" maxActiveSession="-1" minldleSwap="-1" maxldleSwap="-1" maxldleBackup="-1" <Store className="org.apache.catalina.session.FileStore" directory="/home/keith/temp" / / </Manager> </Context>
标签<Manager>元素是专门来配置session管理操作的,该元素中每个属性对应的值:
配置server.xml,即使服务器中间关闭了,一个用户的session也可以通过此配置进行反序列华的恢复;
4,session实例---登录及注销
login.jsp:
<form action="login.jsp" method="post"> userName:<input type="text" name="uname"><br /> uPwd:<input type="text" name="upwd"><br /> <input type="submit" value="Login"> <input type="reset" value="Reset"> </form>
login.jsp:
<body> <% String name = request.getParameter("uname"); String upwd = request.getParameter("upwd"); if(name != null || !"".equals(name) || upwd != null || !"".equals(upwd)){ //定时跳转 session.setAttribute("userid",name); response.setHeader("refresh","2;URL=weclome.jsp"); %> <h2>如果没有跳转,<a href="weclome.jsp">请点击这里:</a></h2> <% } else{ %> 输入信息不合法 <%} %> </body>
weclome.jsp:
<body> <% if(session.getAttribute("userid")!=null){ %> <h2>欢迎:<%=session.getAttribute("userid") %></h2> <a href="logout.jsp">注销</a><br> <% }else{ %> <%=session.getAttribute("userid") %> 请先进行合法登录!<a href="index.jsp">登录</a> <%} %> </body>
测试下!
判断新用户:
<% if(session.isNew()){ %> <h2>欢迎新用户!!!</h2> <%}else {%> <h2>您已经是老用户了!!!</h2> <%} %>
第一次访问的话,会显示欢迎新用户,如果再次刷新一次,则显示老用户!isNew()是通过Cookie方式进行判断的(在之前的操作中,第一次通过request取得全部Cookie时是不会出现JESSINOID的,而第二次却会出现这个系统内建的JSESSIONID,这是由于Cookie是在第一次访问时由服务器端设置客户端的,所有服务器可以依靠是否存在JSESSIONID来判断此用户是否为新用户)。