最近因为好多事耽搁了计划,只能用一首歌的几句歌词来形容:Life's a struggle,日子还要过,品尝喜怒哀乐之后,又是数不清的troubles,everyday有多少问题要去面对,多少夜有多少烦恼让你无法入睡!
上一部分总结了servlet 响应对象,状态码、异常处理、过滤器、Cookie操作,本部分继续总结session等知识。
一、概述
HTTP是一种"无状态"的协议,服务器不会自动保留之前客户端请求的任何记录。但是有三种方式来维持客户端与服务端之间的session会话。
- Cookies web服务器可以分配一个唯一的session会话ID作为每个web客户端的Cookie,对于客户端的后续请求可以使用接收到的Cookie来识别。
- 隐藏的表单字段 服务器可以发送一个隐藏的Html表单字段,以及一个唯一的session会话id:<input type="hidden" name="sessionid" value="sessionid值"/>,即在客户端提交请求得时候自动将隐藏属性传入服务器(无论是get还是post),但是超链接<a href...></a>点击跳转页面不会导致表单提交,因此隐藏表单字段有时候也不支持常规得session会话跟踪。
- URL重写 将sessionid拼接到url后面,发送请求将sessionid带入服务器,便于session会话的关联。比如:http://www.david.com/hello.action;sessionid=12345 URL重写的方式更方便维持session会话,可以在不支持cookie的浏览器上很好的工作,缺点是每个请求都会带上sessionid的参数
Servlet提供了HttpSession接口,提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。通过request对象获取session,req.getSession()方法。
二、Servlet提供操作session的API主要方法
- public Object getAttribute(String name):返回session对象中存储的指定名称的对象,不存在返回null
- public Enumeration getAttributeNames():返回sesson对象存储的所有对象的名称,即key
- public long getCreationTime():返回session创建时间,单位毫秒,以计算机元年开始算起
- public String getId():获取session对象的id,唯一的
- public long getLastAccessedTime():返回客户端最后一次与session请求相关的时间,单位毫秒,计算机元年算起
- public int getMaxInactiveInterval():返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位
- public void invalidate():使session无效,并解除该session绑定的所有对象。
- public boolean isNew():如果客户端还不知道该 session 会话或者如果客户选择不参入该 session 会话,则该方法返回 true
- public void removeAttribute(String name):将指定名称的对象从session对象中移除
- public void setAttribute(String name, Object value) :将对象绑定到session中
- public void setMaxInactiveInterval(int interval): Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位
三、实例演示
servlet 部分:
package com.david.servlet.session;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/session")
public class SessionDemoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//参数ture代表如果不存在session会话,创建一个
HttpSession session = req.getSession(true);
String sessionId = session.getId();
//获取session创建时间
long creationTime = session.getCreationTime();
//网页最后一次访问的时间
long lastAccessedTime = session.getLastAccessedTime();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String ct = sdf.format(new Date(creationTime));
String lat = sdf.format(new Date(lastAccessedTime));
Integer accessCount=1;
if(session.isNew()){
//新的访问
session.setAttribute("test", "session_demo");
}else{
accessCount = (Integer) session.getAttribute("accessCount");
accessCount++;
String test = (String) session.getAttribute("test");
}
session.setAttribute("accessCount", accessCount);
System.out.println("sessionId:"+sessionId);
if(accessCount%3==0){
//第三次的访问的时候将session设置失效
System.err.println("session即将无效,下一次访问即新的开始");
session.invalidate();
}
System.out.println("session创建时间:"+ct);
System.out.println("网页最后一次访问的时间:"+lat);
System.out.println("这是第:"+accessCount+"次session会话");
resp.getWriter().println("访问成功!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
访问结果:
结果可以看出:
1.session无效后,整个session对象销毁,id的不同体现
2.servlet sessionid保存在浏览器的cookie中
3.浏览器每次访问回将sessionid封装在请求头中返回给服务器
补充:tomcat默认session失效时间事30分钟,可以在web.xml中设置session失效的时间