1、由于http协议是无状态的,为了帮助服务器记录浏览器端的状态,就有了会话技术。会话技术分为cookie(客户端)和服务器端(session)。一次会话技术的过程是(默认)从浏览器第一次打开网址到这个浏览器关闭为止。
2、Cookie的内容是存在浏览器端,默认是浏览器关闭,Cookie的内容就取消。除非设置了Cookie的时间。cookie.setMaxAge(int second);
//设置cookie
Cookie cookie1=new Cookie("name", "andy");
//向response添加cookie
response.addCookie(cookie1);
//获取所有的cookie
Cookie[] cookies = request.getCookies();
if (cookies!=null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println("cookie name:"+name+";value is:"+value);
}
}
Cookie的设置,除了时间,还有个路径。如果没有设置的话,默认就是访问路径上一层的资源路径。比如一个http://localhost:8080/user/path1/testHttp?username=andy&password=123产生了Cookie。
Cookie cookie1=new Cookie("name", "lucy");
// cookie1.setPath("/user/path1/"); //不设置相当于这一行代码
response.addCookie(cookie1);
那么,访问http://localhost:8080/user/path1/下的资源都会带这个cookie。包括子目录。比如访问http://localhost:8080/user/path1/path2/login3。也同样带这个cookie
3、Session是服务器端记录会话的状态。服务器会为每个客户端开辟一块内存用于记录客户端的状态,其标识为JSESSIONID。
HttpSession session = request.getSession();
通过上述方法,会获得该会话的session对象,如果没有这个对象,就会创建一个session。并且会向客户端发送关于此会话的sessionid,即会自动在cookie中写入JESSIONID为名的键值对。下次客户端访问服务器(HttpSession session = request.getSession())服务器会自动从cookie中取出JESSIONID,
Set-Cookie: JSESSIONID=04AB4A86583A17E5B8050F2C2E5591A5;
session是一块域,可以向其写入键值对。
4、Session的生命周期默认是30分钟,但是浏览器关闭后,其Cookie就不存JSESSIONID了,所以浏览器就找不到这个session对象了(通过JSESSIONID查找)。为了浏览器关闭后还能找到上次的session,需要通过设置关于此JSESSIONID的cookie的存活时间来实现。
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println("cookie name:"+name+";value is:"+value);
//session持久化
if ("JSESSIONID".endsWith(name)) {
cookie.setMaxAge(60);
response.addCookie(cookie);
}
}
这样浏览器关闭后,在访问服务器,仍可以找到上次的session对象。
5、session对象过多,会对服务器造成压力。一种优化方法是通过配置钝化与活化的监听器HttpSessionActivationListener,来实现多久时间存放在session的对象钝化到磁盘来实现。