1.Cookie
上述图中的 "令牌" 通常就存储在 Cookie 字段中.
比如我们打客服电话
每次打客服电话, 是⼀个会话. 挂断电话, 会话就结束了
下次再打客服电话, ⼜是⼀个新的会话.
如果我们⻓时间不说话, 没有新的请求, 会话也会结束
服务器同⼀时刻收到的请求是很多的.
服务器需要清楚的区分每个请求是从属于哪个用户, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与用户的信息的对应关系.(不同的用户所接受的服务是不同的,session存取着用户的信息)
2.Session
Session是服务器为了保存用户信息而创建的⼀个特殊的对象.
Session的本质就是⼀个 "哈希表", 存储了⼀些键值对结构.
Key 就是SessionID, Value 就是用户信息(用户信息可以根据需求灵活设计)
1. 当用户登陆的时候, 服务器在 Session 中新增⼀个新记录, 并把 sessionId返回给客户端. (通过
HTTP 响应中的 Set-Cookie 字段返回).--服务器生成一个session,并将sessionid返回给客户端
2. 客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的
Cookie 字段带上).
3. 服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的用户信息, 再进行后续操作.
找不到则重新创建Session, 并把SessionID返回
Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失.
Cookie 和 Session 的区别
• Cookie 是客户端保存用户信息的⼀种机制. Session 是服务器端保存用户信息的⼀种机制.
• Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁
• Cookie 和 Session 经常会在⼀起配合使用. 但是不是必须配合.
◦ 完全可以用 Cookie 来保存⼀些数据在客户端. 这些数据不⼀定是用户身份信息, 也不⼀定是
SessionId
◦ Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递.
3.Cookie的获取方式
- Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的。
- HttpServletRequest , HttpServletResponse 是Servlet提供的两个类, 是Spring MVC⽅法的内置对象. 需要时直接在方法中添加声明即可。
- HttpServletRequest 对象代表客⼾端的请求, 当客⼾端通过HTTP协议访问服务器时,HTTP请
- 求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信息
- HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, 比如向客户端发送的数据, 响应头, 状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容
- Spring MVC在这两个对象的基础上进⾏了封装, 给我们提供更加简单的使用方法.
3.1 cookie的伪造方式
1.postman的cookie设置
2.简洁获取Cookie
@RequestMapping("/get")
@RestController
public class Method {
@RequestMapping("/cookie")
public String getCookie(@CookieValue("cookie") String cookie){
if(cookie==null){
return "你没有设置cookie值";
}else{
return "获取的cookie值:"+cookie;
}
}
}
4.Session
4.1 存储和获取session
Session 存储和获取
Session是服务器端的机制, 我们需要先存储, 才能再获取
Session 也是基于HttpServletRequest 来存储和获取的
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request){
HttpSession httpSession=request.getSession();
if(httpSession!=null){
httpSession.setAttribute("userNanme","lay");
//前面是存储的名字,后面是你要存的东西。我们通过前者拿session
//前者是sessionid后者是value
}
return "session设置成功";
}
这个代码中看不到 SessionId 这样的概念的. getSession 操作内部提取到请求中的Cookie ⾥的
SessionId, 然后根据SessionId获取到对应的Session 对象, Session 对象⽤HttpSession来描述
获取Session有两种⽅式
HttpSession getSession ( boolean create);HttpSession getSession ();
4.2 session读取
读取 Session 可以使⽤ HttpServletRequest
@RequestMapping("/getSess")
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;
}
此时我们来读取session,发现为空,那是因为我们并没有存进去。
我们设置的sessionid是userName,而我们读取的是username。通过改变4.1的代码来看结果。
设置成功!!!
简洁写法
@RequestMapping("/setSession1")
public String setSession1(HttpSession httpSession){
if(httpSession!=null){
httpSession.setAttribute("username","lay");//前面是存储的名字,后面是你要存的东西。我们通过前者拿session
}
return "session设置成功";
}
@RequestMapping("/getSession1")
public String getSess1(HttpSession session) {
// 如果 session 不存在, 不会⾃动创建
String username = null;
if (session != null && session.getAttribute("username") != null) {
username = (String) session.getAttribute("username");
}
System.out.println(username);
return "username:" + username;
}
同样是成功的!!!
5.获取header
@RequestMapping("/header")
public String header(@RequestHeader("User-Agent") String userAgent) {
return "userAgent:"+userAgent;
}
//记住@绑定时,前者是改正前,后者是改正后。
//我们返回的是后者
6.设置状态码
Spring MVC会根据我们⽅法的返回结果⾃动设置响应状态码,
程序员也可以⼿动指定状态码
通过Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置
通过Fiddler来观察设置的结果:
状态码不影响⻚⾯的展⽰
7 设置header
这些信息通过 @RequestMapping 注解的属性来实现
先来看 @RequestMapping 的源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
1. value: 指定映射的URL
2. method: 指定请求的method类型, 如GET, POST等
3. consumes: 指定处理请求(request)的提交内容类型(Content-Type),例如application/json,
text/html;
4. produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
5. Params: 指定request中必须包含某些参数值时,才让该⽅法处理
6. headers: 指定request中必须包含某些指定的header值,才能让该⽅法处理请求
7.1 设置Content-Type
我们通过设置 produces属性的值, 设置响应的报头Content-Type
@RequestMapping(value = "/returnJson2",produces = "application/json")
@ResponseBody
public String returnJson2() {
return "{\"success\":true}";
}
7.2 设置其他Header
设置其他Header的话, 需要使⽤Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置
@RequestMapping(value = "/setHeader")
@ResponseBody
public String setHeader(HttpServletResponse response) {
response.setHeader("MyHeader","MyHeaderValue");
return "设置Header成功";
}