欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > Cookie和Session的作用和区别

Cookie和Session的作用和区别

2025/8/13 13:50:11 来源:https://blog.csdn.net/aklnhg/article/details/148034216  浏览:    关键词:Cookie和Session的作用和区别

Cookie

     客户端持久化保存服务器数据的一种机制(持久化存储就是存硬盘里)。Cookie文件数据为键值对形式,客户端根据服务器域名的不同分别存储Cookie,不同域名的Cookie不同,不会产生冲突。

  典型应用场景:

保存会话id(session-id),这是服务器生成的具有唯一性的字符串,也叫token(令牌),但token中除了session-id还包含其他信息,如请求时间,签名啥的。HTTP协议本身属于“无状态”协议,就是默认客户端和服务器的这次通信和下次通信没有直接联系。但是在实际通信过程,是需要知道请求和请求之间的联系的,比如这些请求是否来自同一个客户端,不是同一个客户端,没有登录的话就要先登录才能访问。会话id就是会话时用来标识每一个客户端的。

当客户端第一次向服务器发送请求时,服务器会响应登录页面,客户端将账号和密码发送给服务器,服务器验证信息通过会生成一个令牌,存储在响应报文的请求头的set-cookie键值对中将令牌发送给客户端,客户端保存令牌在cookie中,后面客户端每次请求都会将令牌发送给服务器,因为cookie在请求报文的请求头中。服务器识别令牌来自哪个客户端,后续的通信只有令牌没过期就不会再让该客户端重新登录。

Session 

Session(会话)是一个客户端和服务器之间的不中断的请求和响应的过程,会话中服务器保存客户端信息。本质是用一个哈希表,存储了一些键值对结构的数据,Key就是SessioID,Value就是用户信息。当一个未知客户端向服务器程序发送第一个请求就开始了一个会话。当客户端明确结束会话或服务器在一个时限内没有接受到客户端的任何请求,会话就结束了。对每个客户的请求,服务器能根据会话id识别出请求来自哪个客户端,属于哪个会话。

session信息默认是保存在内存中,当主机重启,信息就会丢失。

Cookie和Session的区别

1.cookie是客户端的保存用户信息的机制,session是服务器保存用户信息的机制;

2.cookie和session经常配合使用,但不是必须配合使用。session-id可以通过cookie/set-cookie传递,也可以通过url传递;

3.session-id是匹配cookie和session之间的桥梁,就是实现客户端用户信息和服务器用户信息之间的匹配。

获取Cookie

传统方法

Spring MVC是基于Sevlet API构建的原始Web框架,也是在Sevlet的基础上实现的。

HttpSevletRequest,HttpSevletResponse是Sevlet提供的两个类,是SpringMVC方法内置对象。

HttpSevletRequest对象是代表客户端的请求,当客户端通过Http协议访问服务器时,HTTP请求头中的所有信息都封装到这个对象中, 通过这个对象提供的方法,可以获取客户端请求的所有信息。

HttpSevletResponse对象封装了Http响应的所有信息,如向客户端发送的数据,响应头 ,状态码。

@RequestMapping("/m10")
public String method10(HttpServletRequest request,HttpServletResponse response) // 获取所有 cookie 信息Cookie[] cookies = request.getCookies();//打印Cookie信息StringBuilder builder = new StringBuilder();if (cookies!=null){for (Cookie ck:cookies) {builder.append(ck.getName()+":"+ck.getValue());}}return "Cookie信息:"+builder;
}
注释的方法

@CookieValue(“Cookie名称”);//跟浏览器中存储的cookie名一致

@GetMapping("/path")
public String handlerMethod(@CookieValue("cookieName") String cookieValue) {//cookieValue是绑定的参数// 使用 cookieValue
}

获取Session

Session是服务器端的机制, 我们需要先存储, 才能再获取,也是基于HttpServletRequest 来存储和获取的。
存储Session
RequestMapping("/setSess")
public String setsess(HttpServletRequest request) {// 获取Session对象HttpSession session = request.getSession();if (session != null) {session.setAttribute("username", "java"); //设置Session}return "session 存储成功";
}
HttpSession getSession(boolean create); //参数如果为 true, 则当不存在会话时新建会话; 参数如果
为 false, 则当不存在会话时返回 null。
HttpSession getSession();  //默认值为ture
void setAttribute(String name, Object value);//设置session对象属性
读取Session
@RequestMapping("/getSession")
public String sess(HttpServletRequest request) {// 如果 session 不存在, 不会⾃动创建HttpSession session = request.getSession(false);String username = null;if (session != null && session.getAttribute("username") != null) {username = (String) session.getAttribute("username");}return "username:" + username;
}
Object getAttribute(String name);//返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。

获取HTTP请求头

1.用HttpServletRequest获取

@RequestMapping("/header")
public String header(HttpServletRequest request, HttpServletResponse response)
String userAgent = request.getHeader("User-Agent");
return name + ":"+userAgent;
}
使用HttpServletRequest 提供的getHeader()来获取, 参数对应HTTP请求报头的"Key"

2.用注释

@RequestMapping("/header")
public String header(@RequestHeader("User-Agent") String userAgent) {return "userAgent:"+userAgent;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词