cookie&session
要了解cookie与session首先就要知道一个概念——会话;
会话的概念
用户打开浏览器,浏览不同的网页,发出多个请求,直到关闭浏览器的过程,称为一次会话(多次请求). 如同打电话。
我们在会话的过程(多次请求)之中,用户可能会产生一些数据,这些数据有的需要保存起来的,我们就可以通过会话技术来保存用户各自的数据。
常用的会话技术:
-
Cooike
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了
-
Session
session是服务器端的技术。服务器为每一个浏览器开辟一块内存空间,即session。由于内存空间是每一个浏览器独享的,所有用户在访问的时候,可以把信息保存在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问的时候,浏览器会把cookie(sessionId)带过来,找到对应的session对象。
Cookie
cookie的概念:
Cookie是一种客户端的会话技术,它是服务器存放在浏览器的一小份数据,浏览器以后每次访问该服务器的时候都会将这小份数据携带到服务器去。
cookie入门
- 创建一个Cookie对象(cookie只能保存字符串数据。且不能保存中文)
new Cookie(String name,String value);
- 把cookie写回浏览器
response.addCookie(cookie);
- 获得浏览器带过来的所有Cookie:
request.getCookies() ; //得到所有的cookie对象。是一个数组,开发中根据key得到目标cookie
- cookie的 API
cookie.getName() ; //返回cookie中设置的key
cookie.getValue(); //返回cookie中设置的value
那我们来看一下以下入门代码
//第一次是服务器通过response 响应给客户端
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
//获得所有的cookie
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
//获得name是akey的cookie对象, 以及它的value
if("akey".equals(cookie.getName())){
System.out.println(cookie.getValue());
}
//获得cookie的name和value
System.out.println(cookie.getName() + "=" + cookie.getValue());
}
}
//创建Cookie
Cookie aCookie = new Cookie("akey", "aaa");
Cookie bCookie = new Cookie("bkey", "bbb");
//写给浏览器
response.addCookie(aCookie);
response.addCookie(bCookie);
}
以上仅是cookie的入门,如果看懂的话那就接着进行进阶模式;
cookie进阶
1. cookie的分类
cookie可以分为会话级别cooie和持久性cookie;
在默认的情况下,当浏览器进程结束(浏览器关闭,会话结束)的时候,cookie就会消失。
为了让cookie持久化存储,我们可以给cookie设置maxAge,也就是存储时间;
//给cookie设置有效期 :时间是秒
// -1:默认。代表Cookie数据存到浏览器关闭(保存在浏览器文件中)。
// 正整数:以秒为单位保存数据有效时间(把缓存数据保存到磁盘中)
// 0:代表删除Cookie.如果要删除Cookie要确保路径一致。
cookie.setMaxAge(int expiry)
2.cookie设置有效路径
setPath(String url) ;设置路径
有效路径作用 :
- 保证不会携带别的网站/项目里面的cookie到我们自己的项目
- 如果路径不一样, cookie的key可以相同
- 保证自己的项目可以合理的利用自己项目的cookie
cookie的路径通常设置 / 或者 /发布项目名设置的有效是 /webCookie. 当前项目下的Servlet都可以使用该cookie. 一般这么设置:
cookie.setPath(request.getContextPath());
只要是当前项目里面的资源 路径必须包含项目名路径.
我们可以通过cookie做一个小案例,在访问一个资源的时候,展示上次访问的时间,若是第一次访问则展示:你是第一次访问.若不是第一次则展示:你上次访问的时间是:xxxx。
@WebServlet("/rem")
public class RememberServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//1.判断是否是第一次访问(说白了判断目标cookie是否为null)
Cookie[] cookies = request.getCookies();
Cookie targetCookie = CookieUtils.getTargetCookie("lastTime", cookies);
if(targetCookie == null){
//2.为null, 第一次访问
//2.1记录当前的时间到Cookie
Cookie cookie = new Cookie("lastTime", System.currentTimeMillis() + "");
cookie.setMaxAge(60*60*24);
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
//2.2响应'你是第一次访问'
response.getWriter().print("你是第一次访问");
}else{
//3. 不为null 不是第一次访问
//3.1 记录当前的时间到Cookie
Cookie cookie = new Cookie("lastTime", System.currentTimeMillis() + "");
cookie.setMaxAge(60*60*24);
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
//3.2 从cookie获得上次的访问的时间 响应
String timeStr = targetCookie.getValue();
Date date = new Date(Long.parseLong(timeStr));
response.getWriter().print("你上次访问的时间是:"+date.toLocaleString());
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Session
session的概念
session是服务器端的技术。服务器为每一个浏览器开辟一块内存空间,即session对象。由于session对象是每一个浏览器特有的,所有用户的记录可以存放在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问的时候,浏览器把sessionId带过来,找到对应的session对象,也就是说session基于cookie
session与cookie的区别
- cookie是保存在浏览器端的,大小和个数都有限制。session是保存在服务器端的, 原则上大小是没有限制(实际开发里面也不会存很大大小), 安全一些。
- cookie不支持中文,并且只能存储字符串;session可以存储基本数据类型,集合,对象等。
session入门
获得session(如果第一次调用的时候其实是创建session)
request.getSession();
获取值
Object getAttribute(String name);
存储值
void setAttribute(String name, Object value);
移除
void removeAttribute(String name) ;
注:
浏览器关闭了, session使用不了, 是session销毁了吗?
session没有销毁.
session基于cookie, sessionId保存到cookie里面的, 默认情况下cookie是会话级别,浏览器关闭了cookie就是消失了,也就是说sessionId消失了, 从而找不到对应的session对象了, 就不能使用了.
解决: 自己获得sessionId, 自己写给浏览器 设置Cookie的有效时长, 这个Cookie的key必须: JSESSIONID