会话技术
当用户打开浏览器的时候,访问不同的资源,直到用户将浏览器关闭,可以认为这是一次会话.
作用:
因为http协议是一个无状态的协议,它记录不了上次访问的内容.用户在访问过程中难免会产生一些数据,通过会话技术就可以将起保存起来.
例如:
用户登录
购物车
访问记录
.....
分类:
cookie:浏览器端会话技术
session:服务器端会话技术
Cookie【javax.servlet.http.Cookie】
翻译为:小饼干 小甜点
cookie是由服务器生成[服务端创建Cookie:Cookie cookie = new Cookie();],通过response将cookie写回浏览器(set-cookie).[写回浏览器:response.adddCookie(cookie);],保留在浏览器上,下一次访问,浏览器根据一定的规则携带不同的cookie(通过request的头 cookie),我们服务器就可以接收cookie
cookie的api:
构造方法:new Cookie(String key,String value)
写回浏览器:
response.addCookie(Cookie c)
获取cookie:
Cookie[] request.getCookies()
获取指定名称的cookie
Cookie c=CookUtils.getCookieByName("lastTime",
request.getCookies());
//获取指定Cookie的工具类
public class CookUtils {
/**
* 通过名称在cookie数组获取指定的cookie
* @param name cookie名称
* @param cookies cookie数组
* @return
*/
public static Cookie getCookieByName(String name, Cookie[] cookies) {
if(cookies!=null){
for (Cookie cookie : cookies) {
//通过名称获取
if(name.equals(cookie.getName())){
//返回
return cookie;
}
}
}
return null;
}
}
cookie的常用方法:
String getName():获取cookie的key(名称)
String getValue():获取指定cookie的值
setMaxAge(int 秒):设置cookie在浏览器端存活时间 以秒为单位
若设置成 0:删除该cookie(前提必须path路径一致)
setPath(String path):设置cookie的路径.
作用:当我们访问的路径中包含此cookie的path,则携带该cookie。
默认路径:
访问serlvet的路径,从"/项目名称"开始,到最后一个"/"结束
例如:
访问的serlvet路径:
/day11/a/b/hello
默认路径为:
/day11/a/b
手动设置路径:以"/项目名"开始,以"/"结尾;
扩展:删除浏览记录
技术分析:
cookie.setMaxAge(0)
注意:
cookie不能跨浏览器
cookie中不支持中文
HttpSession
session【HttpSession】:服务器端会话技术.
当我们第一次访问服务器的时候,服务器获取id【jsessionid】,
能获取id
要拿着这个id去服务器中查找有无此session
若查找到了:直接拿过来使用,将数据保存,需要将当前sessin的id返回给浏览器
若查找不到:创建一个session,将你的数据保存到这个session中,将当前session的id返回给浏览器
不能获取id
创建一个session,将你的数据保存到这个session中,将当前session的id返回给浏览器
【session依赖于cookie】
浏览器访问服务器,服务器获取jsessionid
若获取不到
创建一个sesion,将数据保存,将当前session的jsessionid通过cookie返回浏览器
若获取到
拿着该jsessionid去session池中查找有无该session
若查找到:
直接拿过来使用,将jsessionid写回浏览器
若查找不到
创建一个sesion,将数据保存,将当前session的jsessionid通过cookie返回浏览器
获取一个session:
HttpSession request.getSession()
域对象:
xxxAttribute--(setAttribute|getAttribute|removeAttribute)
void setAttribute(String name, Object value):新增
Object getAttribute(String name) :获取
void removeAttribute(String name) :移除
void setMaxInactiveInterval(int interval) :设置过期时间
void invalidate():移除session
ServletContext getServletContext()