会话及会话技术
- 使用request域对象保存商品信息:
- 结论:使用request保存商品信息不可以,因为每次发送请求,都会产生一个新的请求对象
- 使用ServletContext域对象保存商品信息:
- 结论:使用ServletContext域对象保存商品信息,可以,但是不合理。多个客户共用一个ServletContext对象,最后结算时会把前面的不是自己购买的商品都结算了。
所以在开发中,采用Cookie和Session来保存会话保存会话中产生的数据
Cookie
存在客户端
-
什么是Cookie?
- Cookie是一种会话管理技术,它是用来保存会话过程中产生的数据,然后再浏览器和服务器交互时,会使用Cookie里面保存的数据。
-
Cookie的执行原理
-
Cookie常用的API
-
获得Cookie对象:Cookie cookie = new Cookie(String name, String value);
-
回写(响应)cookie到浏览器端:response.addCookie(cookie);
-
得到cookie的名称:String key = cookie.getName();
得到cookie的值:String value = cookie.getValue();
-
给cookie设置生命时长:setMaxAge(int s);
比如:
cookie.setMaxAge(60*60*24)
//说明cookie有效时间为1天cookie分类:
第一类:会话级别cookie,浏览器关闭,cookie对象就销毁
第二类:持久化cookie,通过setMaxAge这个方法来设置
-
给cookie设置路径:设置域名:
setPath(路径url);setDomain(域名);
-
得到cookie:Cookie[] cookies = request.getCookies();
-
案例:通过Cookie实现记录用户的上次访问时间
package top.lukeewin.Cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
//@WebServlet(name = "LastAccessServlet")
public class LastAccessServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理中文乱码问题
response.setContentType("text/html;charset=utf-8");
String lastAccessTime = null;
//获取所有Cookie,放到数组中
Cookie[] cookies = request.getCookies();
//遍历数组
for (int i = 0; cookies !=null && i < cookies.length; i++) { //cookies !=null 注意判断是否为空
//判断cookie的名字是否是lastAccessTime
String name = cookies[i].getName();
if ("lastAccessTime".equals(name)) {
lastAccessTime = cookies[i].getValue(); //获取cookie的值
break; //如果找到了,就立刻结束
}
}
//判断是否是第一次访问
if (lastAccessTime == null) {//第一次访问
response.getWriter().print("你是首次访问本网站!");
}else {//不是第一次访问
response.getWriter().print("你上次访问本网站的时间是:" + lastAccessTime);
}
//获取每次访问的时间
String currentTime = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss").format(new Date());
//把currentTime作为cookie的值存到cookie中
Cookie cookie = new Cookie("lastAccessTime", currentTime);
//设置cookie保存时间
cookie.setMaxAge(60*60*24); //单位为秒
//把cookie响应到客户端浏览器中
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
Session
-
什么是Session?
Session是一种会话管理技术,Session用来保存会话过程中的数据,保存的数据存储到服务器端。
Session原理:基于Cookie实现的,更确切的说是基于会话级别的Cookie实现的
-
HttpSession API
session常用方法:
-
得到session的id(JESSIONID对应的值):getId();
-
设置session的生命时长:setMaxInactiveInterval(int interval);
-
销毁session:invalidate();
得到session:HttpSession session = getSession();
-
-
session域对象:作用范围一次完整的会话(包含多个请求)
- 存值:setAttribute(String key, Object obj);
- 取值:Object obj = getAttribute(String key);
- 移除:removeAttribute(String key);
总结域对象:request域对象 session域对象 servletContext域对象,作用范围依次变大。
request域对象:作用范围一次请求,通常和转发操作配合使用
session域对象:作用范围一次会话,通常和重定向操作配合使用
servletContext域对象:作用范围整个项目,和重定向,转发操作都可以配合使用
-
Session超时管理
Session对象默认存活时间是30分钟
可以配置web.xml
<session-config> <session-timeout>30</session-timeout> </session-config>
立即销毁session对象:invalidate();
Q.E.D.