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
RequestMapping("/setSess")
public String setsess(HttpServletRequest request) {// 获取Session对象HttpSession session = request.getSession();if (session != null) {session.setAttribute("username", "java"); //设置Session}return "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;
}
获取HTTP请求头
1.用HttpServletRequest获取
@RequestMapping("/header")
public String header(HttpServletRequest request, HttpServletResponse response)
String userAgent = request.getHeader("User-Agent");
return name + ":"+userAgent;
}
2.用注释
@RequestMapping("/header")
public String header(@RequestHeader("User-Agent") String userAgent) {return "userAgent:"+userAgent;
}