Cookie和Session
Cookie和Session
会话
-
什么是会话?
会话是浏览器和服务器之间的多次请求和响应
也就是说,从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止的这段时间内容产生的多次请求和响应,合起来叫做浏览器和服务器之间的一次会话
-
有状态会话:一个网站知晓你登陆过、存储了一些基本信息
保存会话的两种技术
- cookie:
- 一种客户端技术,服务器响应相关信息给浏览器,保存在浏览器本地
- session:
- 服务器技术,保存会话信息到服务器中,把信息和数据放在session中
Cookie
Cookie是一种存储在计算机浏览器目录中的文本文件
一个例子:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("gbk");
resp.setCharacterEncoding("gbk");
PrintWriter out = resp.getWriter();
//cookie 服务器端从客户端取得
Cookie[] cookies = req.getCookies();//这里返回数组
// 判断cookie是否存在
if(cookies!=null){
out.print("你第一次访问的时间是:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//获取cookie的名字
if(cookie.getName().equals("LastLoginTime")){
// 显示最后一次登录的值
long l = Long.parseLong(cookie.getValue());
Date date = new Date(l);
out.write(date.toLocaleString());
}
}
}else {
out.print("这是你第一次访问网站");
}
// 服务器给客户端响应cookie
Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis()+"");
resp.addCookie(cookie);
}
第一次访问:
第二次访问:
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
- cookie大小有限制4kb
- 300个cookie浏览器上限
删除cookie
-
不设置有效期,关闭浏览器,自动失效
-
设置有效期
// 服务器给客户端响应cookie Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis()+""); // 设置有效期为0 cookie.setMaxAge(0); resp.addCookie(cookie);
如果cookie设置为中文可能会出现乱码:可以通过以下方法解决
URLDecoder.decode(cookie.getValue(),"UTF-8");解码
URLEncoder.encode("啊","utf-8");编码
Session
- 服务器会给每一个用户(浏览器)创建一个session对象
- 一个Session独占一个浏览器,只要浏览器没关,session就存在
Session和cookie区别:
- cookie是把用户的数据保存在浏览器
- session把用户的数据写到用户独占session中,服务器端保存
- session对象由服务创建
创建场景:
- 保存一个登录用户的信息
- 购物车信息
- 整个网站经常使用的数据
使用例子:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
// 浏览器显示乱码问题
resp.setContentType("text/html;charset=utf-8");
// 得到session
HttpSession session = req.getSession();
// 给session存储东西
session.setAttribute("name","lihua");
// 获得session的id
String id = session.getId();
// 判断session是不是新创建的
if(session.isNew()){
resp.getWriter().write("session创建成功,id是:"+id);
}else {
resp.getWriter().write("session已经在服务器中存在,id是:"+id);
}
}
/*session创建的时候创建一个cookie响应回去,键值分别为JSESSIONID,和session的Id,浏览器通过这个判断session是否已经创建,和辨别不同的用户
结果:可以看出不同浏览器id不同
另外一些其他方法:
session.removeAttribute("name");//删除键值
session.invalidate();//注销session
//注销后重新生成一个id,相当于重新登录或关闭浏览器
也可以在web.xml中设置默认失效时间
<session-config>
<!-- 设置session默认失效时间:1分钟-->
<session-timeout>1</session-timeout>
</session-config>