Cookie —— 客户端机制
Session —— 服务端机制
本篇博客主在用servlet和SpringBoot两种方式分别获取Session和Cookie,用来比较记忆与分析
1、cookie和Session以及Header知识点
(注:若完全不懂Cookie、Session以及Header是什么,必须去系统地学习一下,不要只靠着本篇博客)
cookie:
但以上只是客户端机制,此时在服务器这边就需要记录“令牌”信息,以及令牌对应的用户信息,这个就是Session机制所做的工作
Session:
Session就是 会话 的意思
服务器同一时刻收到的请求是很多的,服务器需要清楚的区分每个请求是属于哪个用户,也就属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系
Session是服务器为了保存用户信息而创建的一个特殊的对象
Session中的值也保存在客户端的cookie中
Header:
Header即Http请求头(标头)
HTTP标头(Header)是HTTP请求和响应中的一部分,用于传输与请求或响应相关的元数据信息。HTTP标头包含一系列键值对(名称-值对),用于传递与消息内容、处理、身份验证、缓存控制、内容类型等相关的信息。HTTP标头通常分为请求头(Request Headers)和响应头(Response Headers)两大类。
HTTP标头的一些常见用途包括:
身份验证:HTTP标头可以包含用于认证用户身份的信息,例如
Authorization
标头用于传递身份验证凭证。内容类型:
Content-Type
标头用于指定响应内容的MIME类型,帮助客户端正确解释响应的内容。内容长度:
Content-Length
标头指示响应内容的长度,以字节为单位。缓存控制:
Cache-Control
标头用于定义缓存策略,控制响应内容的缓存和过期行为。跳转与重定向:
Location
标头用于指定重定向的目标URL,Referer
标头包含引导请求的URL。用户代理信息:
User-Agent
标头用于标识发送请求的用户代理(通常是浏览器或应用程序)的信息。接受语言和内容编码:
Accept-Language
和Accept-Encoding
标头允许客户端指定其首选的语言和内容编码。跨域资源共享(CORS):
Access-Control-Allow-Origin
和其他相关标头用于支持跨域请求。安全性:
X-Frame-Options
和Strict-Transport-Security
等标头用于增强安全性。自定义标头:开发人员可以定义自己的自定义HTTP标头以传递额外的信息。
HTTP标头允许HTTP协议具有灵活性和可扩展性,以便在通信中传递各种元数据和指令。不同的HTTP请求和响应都可以包含不同的标头,以满足其特定的需求。这些标头对于Web开发和网络通信中非常重要,因为它们允许客户端和服务器之间进行有效的信息交换和控制。
2、设置/获取 Cookie
设置cookie——直接在浏览器中设置
点击检查后在如图位置设置Cookie
后端获取Cookie
servlet版本:(更常用)
@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest request){
// 拿到cookie
Cookie[] cookies = request.getCookies();
// for(Cookie cookie : cookies){
// System.out.println(cookie.getName()+":"+cookie.getValue());
// }
// lam表达式,和上面循环意思一样
if (cookies != null){
// cookies为null时,会报空指针的异常,所以判断
Arrays.stream(cookies).forEach(cookie -> {
System.out.println(cookie.getName()+":"+cookie.getValue());
});
}
return "获取cookie成功";
}
Spring版本:
// SpingBoot获取cookie
@RequestMapping("/getCookie2")
public String getCookie2(@CookieValue String userId,@CookieValue String goodId){
return "cookie存取的值userId:" + userId + ",gooId:" + goodId;
}
注:使用注解的方式只能一个一个的去拿
总结:最常用的是servlet版本,因为Spring版本只能一个一个的取值,servlet可以直接获取所有cookie
3、设置/获取Session
设置session
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute("userId", "6_6_6");
return "success";
}
servlet版本获取session:
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request){
// false: 如果没有session,会创建一个session
HttpSession session = request.getSession(false);
if(session != null){
String userId = (String) session.getAttribute("userId");
return "登录用户:"+userId;
}
return "session 为空";
}
Spring方式获取Session:
@RequestMapping("/getSession2")
public String getSession2(@SessionAttribute(required = false) String userId){
return "userId:" + userId;
}
注:使用注解的方式只能一个一个的去拿
使用HttpSession内置对象获取Session
@RequestMapping("/getSession3")
public String getSession3(HttpSession session){
String userId = (String) session.getAttribute("userId");
return "登录用户:"+userId;
}
注:这种内置对象的方式若没有获取到Session,即Session为空的情况下会报错
总结:servlet方式都较为常用
4、设置/获取Header
设置响应的Header:
@ResponseBody
@RequestMapping(value = "/r1",produces = "application/json;charset=utf-8")
// @RequestMapping(value = "/r1")
public String r1(HttpServletResponse response){
//设置header
response.setHeader("myhead","myhead");
return "{'OK':1}";
}
servlet方式获取Header:
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){
String userAgent = request.getHeader("User-Agent");
return "userAgent:" + userAgent;
}
Spring方式获取Header:
@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String userAgent){
return "userAgent:" + userAgent;
}