Session和Cookie

81次阅读

共计 2679 个字符,预计需要花费 7 分钟才能阅读完成。

由于 http 协议无状态,需要用 session 记录客户状态,如购物车场景,服务端为用户创建特定 session,用于标识并跟踪用户 服务端保存 session 的方法很多,内存,数据库,文件都有 集群时考虑 session 的转移,大型网站会有专门的 session 服务器集群来保存用户会话,这个时候 session 一般存放在内存

服务端如何识别特定的客户?
每次 http 请求,客户端会发送响应 cookie 到服务器,大多数应用用 cookie 来实现 session 跟踪的 第一次创建 session 时,服务端会在 http 协议告诉客户端,需要在 cookie 类里记录一个 session id,以后每次请求会发送这个 id 到数据库,我就知道你是谁了 如果浏览器禁用了 cookie,可以 url 重写来进行会话跟踪

Cookie 登陆场景,登陆过一次网站,第二次访问不需要输入账号密码自动登陆,就是把信息写到 Cookie 里,访问网站的时候,网站页面的脚本读取 Cookie,自动帮你把用户名填写了
Cookie
cookie 机制 cookie 内容

CookieAPI
创建和发送 cookie
@WebServlet(“/sendCookie”)
public class sendCookie extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建 cookie
Cookie cookie=new Cookie(“name”,”zqf”);// 只能存字符串,和域对象不一样
// 发送 cookie 到客户端
response.addCookie(cookie);
}
}
第一次访问可以看到响应头包含 cookie, 发送给客户端
第二次访问可以看到请求头也包含了 cookie, 是服务器端发送到客户端保存的

cookie 是会话级别,也就是说浏览器开始到关闭,关闭浏览器时 cookie 则消失,但是有时候为什么没有消失呢,是因为给 cookie 设置了在客户端的持久化时间
设置 cookie 持久化时间
cookie.setMaxAge(10*60*1000);
设置 cookie 在浏览器中存储时间为 10 分钟,到时间自动删除 cookie 信息
设置 cookie 携带路径
cookie.setPath(“/”); 访问服务器下所有资源都携带这个 cookie
cookie.setPath(“/ 项目名 / 当前页面 ”); 则访问当前页面才携带 cookie

删除 cookie.
@WebServlet(“/removeCookie”)
public class removeCookie extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 删除客户端保存 name-xxx 的 cookie 信息
Cookie cookie=new Cookie(“name”,””);
// 设置时间为 0
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
获取 cookie
@WebServlet(“/getCookie”)
public class getCookie extends HttpServlet {
// 获得 cookie 的值
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies) {
String cookieName = cookie.getName();
if(cookieName.equals(“name”)) {
String cookieValue = cookie.getValue();
System.out.println(cookieValue);
}
}
}
}
Session
session 技术是基于 cookie,cookie 技术存储 session 编号 –jsessionid
session 机制

session 是一种服务度机制,类似散列表结构来存储用户数据
浏览器第一次向客户端发送请求时,服务器会自动生成一个 session 和 sessionid
sessionid 唯一标识这个 session
服务器响应时把 sessionid 发送给浏览器
浏览器第二次向服务器发送请求时就会携带这个 sessionid
服务器通过这个 id 找到对应的 session 获取用户数据
session 缺点
cookie 被禁止,session 也会被禁止,可以通过 url 重写摆脱托 cookie

Cookie 通过在客户端记录信息确定用户身份,Session 通过在服务器端记录信息确定用户身份
Session 数据放在服务器上,Cookie 数据存放在客户的浏览器上
session 的生命周期
生命周期
创建
第一次执行 request.getSession()时创建
销毁
服务器 (非正常) 关闭
Session 过期
tomcat 下 web.xml 自动配置
手动销毁
session.invalidate();

服务器关闭,session 就销毁了嘛?
不对,有时间的,看 session 是否过期
session 和 cookie 区别
session 保存在服务器,cookie 保存在客户端
session 中保存的时对象,cookie 保存的是字符串
session 不能区分路径,同一个用户访问一个网站期间,所有的 session 在任何一个地方都可以访问
cookie 如果设置路径,则在某些地方不能访问
session 需要借助 cookie 才能正常工作,如果禁用 cookie,session 则失效
客户端会在发送请求的时候,自动将本地存活的 cookie 封装在信息头发送给服务器
session 和 cookie 应用场景
session 上下文机制,针对每一个用户,通过 sessionid 来区分不同客户
session 是以 cookie 或 url 重写为基础的,默认使用 cookie 实现,系统会创造一个名为 jsessionid 的输出 cookie
重要状态走 session, 不重要走 cookie, 登陆信息用 session,购物车用 cookie

正文完
 0