写在前面:
request.getCookies() response.addCookie(cookie) |
cookie.getName() getValue() setValue() setMaxAge(s) |
URLEncode.encode(str,"utf-8") URLDecode.decode(str,"utf-8") |
request.getSession() |
session.setAttribute(名,值) getAttribute(名) removeAttribute(名) |
1. 会话技术
浏览器第一次给服务器发送请求,会话建立,直到一方断开为止
一次会话包含多次请求和响应
功能:在一次会话的多次请求间共享数据
客户端会话技术:cookie(数据保存在浏览器)
服务端会话技术:session(数据保存在服务端HttpSession)
2. cookie
使用步骤
创建对象,绑定数据:new Cookie(名,值)
发送cookie:response.addCookie(cookie)
接受cookie:request.getCookies() / cookie.getName() / cookie.getValue()
实现原理
浏览器向A发送请求
A将cookie信息放到响应头中,给浏览器发出响应(set-cookie:名=值)
浏览器将cookie信息保存下来(名=值)
浏览器将cookie信息放到请求头中,向B发出请求(cookie:名=值)
一些细节问题
一次可以发送多个cookie(多创建几个cookie对象)
cookie在浏览器中保存时间:默认到浏览器关闭;可以手动设置cookie.setMaxAge(n)
--------n为正数:持久化,将cookie写到硬盘文件中,经过n秒后,文件消失
--------n为负数:默认值,到浏览器关闭
--------n为0:删除cookie信息
在tomcat8之后,cookie中可以保存中文,但是不支持特殊字符(比如空格)建议使用url编码解码
URLEncoder.encode(str,"utf-8");//编码
URLDecoder.decode(str,"utf-8");//解码
cookie名相同时,会覆盖
cookie共享问题:
一个tomcat下的多个项目:setPath(path)-----默认不共享,path设置为 / 可以共享(服务器的根目录)
同一个项目,在不同的tomcat下:setDomain(path)-----设置一级域名相同,则可以共享
特点
存在浏览器,不安全;一般存不敏感的数据
对单个cookie大小有限制(4kb左右);对同一域名下的cookie总量有限制(20个)
//案例:记住上一次访问时间
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr=sdf.format(date);
dateStr= URLEncoder.encode(dateStr,"utf-8");//编码
Cookie[] cookies = request.getCookies();
boolean flag=false;
String name="lastTime";
if(cookies!=null && cookies.length>0){
for(Cookie cookie:cookies){
if(name.equals(cookie.getName())){
flag=true;
cookie.setValue(dateStr);
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
String lastTime=cookie.getValue();
lastTime= URLDecoder.decode(lastTime,"utf-8");//解码
writer.println("上次访问时间:"+lastTime);
break;
}
}
}
if(!flag){//这里注意:先设置cookie,再write输出
Cookie cookie=new Cookie(name,dateStr);
cookie.setMaxAge(60*60*24);
response.addCookie(cookie);
writer.println("首次访问");
}
}
3. session
session依赖于cookie
使用:
HttpSession session=request.getSession()
取值:getAttribute(名)
存值:setAttribute(名,值)
删除:removeAttribute(名)
原理:
服务器A第一次获取session,没有cookie时,会在内存中创建一个HttpSession对象
然后把这个session对象的id放入响应头中(set-cookie: jsessionid=xxx),给浏览器作出响应
浏览器会把这个cookie放到请求头中(cookie: jsessionid=xxx),给B发出请求
B会根据session的id,去内存中找有没有对应的session
细节:
浏览器关闭,服务端不关闭,两次获得的session不是同一个:因为会话结束了
-----设置成同一个的方法:创建一个jsessionid的cookie,并持久化
浏览器不关闭,服务器关闭,两次获得的session不是同一个:因为服务器关闭释放了内存
-----设置成同一个的方法:session钝化、活化;tomcat已自动完成两个过程
----------钝化:服务器正常关闭前,将session信息序列化到磁盘
----------活化:服务器启动之后,将session文件反序列化成内存中的session对象
-----idea无法完成两个过程,需要将项目打包放到tomcat下,由tomcat启动执行
----------因为idea重新启动时,会将work文件夹删掉重建,就把序列化的session文件删除了
特点:
任意类型;任意大小;存在服务器(安全)