Spring MVC 入门Ⅱ
一、接收Cookie / Session
-
这两者都是用来保存用户信息的,但不同的是:
- Cookie存在客户端
- Session存在服务器
-
Session产生时会生成一个唯一性的SessionID,这个SessionID可以用于匹配Session和Cookie
-
SessionID可以在Cookie/Set-Cookie传递,也可以在URL中传递
1. 获取Cookie(获取所有的):
代码:
@RequestMapping("/r12")
public String r12(HttpServletRequest request, HttpServletResponse response) {
// 获取Cookie
Cookie[] cookies = request.getCookies();
// 打印
StringBuilder builder = new StringBuilder();
if (cookies != null) {
for (Cookie cookie : cookies) {
builder.append("key: "+cookie.getName() + " value:" + cookie.getValue()+"\n");
}
}
return "Cookie信息:" + builder;
}
结果:
从这个示例中可以看出,Cookie是可以伪造的,所以后端在接收Cookie信息时需要进行Cookie校验
2. 简洁获取Cookie
可以通过
@CookieValue
注解进行指定cookie的key值进行获取value。
代码:
@RequestMapping("/r13")
public String r13(@CookieValue("name") String name) {
return "r13获取到cookie:" + name;
}
结果:
二、获取Session
1. 理解Session
Session是用于存储用户信息并且保存在服务器端的数据。这个过程是无状态的。
什么是会话?
会话就是客户端与服务器进行的一次建立连接发送数据的过程。
就像在店铺咨询客服一样,每次发起一次咨询的过程就是一次会话。
什么是无状态的?
每次发起新的咨询,即使是同一个客服对你进行服务,这个客服仍然不知道你是谁。这个过程是无记忆的,断开连接就“恢复出厂设置了”
2. 获取Session
2.1HttpServletRequest获取
package com.example.springmvcdemo;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/session")
public class SessionController {
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request, HttpServletResponse response) {
HttpSession session = request.getSession();
session.setAttribute("name", "zhangsan");
return "session设置成功";
}
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request) {
HttpSession session = request.getSession();
String name = (String) session.getAttribute("name");
return "name: "+name;
}
}
一定要先进行设置Session,再获取Session。
2.2 HttpSession获取
@RequestMapping("/getSession2")
public String getSession2(HttpSession session) {
return "HttpSession获取Session成功:"+session.getAttribute("name");
}
2.3 @SessionAttribute获取
@RequestMapping("/getSession3")
public String getSession2(@SessionAttribute("name") String name) {
return "@SessionAttribute获取Session成功:"+name;
}
三、获取Header
3.1 HttpServletRequest获取
代码:
@RestController
@RequestMapping("/header")
public class HeaderController {
@RequestMapping("getHeader")
public String getHeader(HttpServletRequest request) {
String header = request.getHeader("User-Agent");
return "HttpServletRequest获取到Header:"+header;
}
}
结果:
Fiddler抓包:
3.2 @RequestHeader获取
代码:
@RequestMapping("getHeader2")
public String getHeader(@RequestHeader("User-Agent") String ua) {
return "@RequestHeader获取到Header:"+ua;
}
结果:
3.3 设置Header
3.3.1 设置Content-Type
代码:
@RequestMapping(value = "setHeader", produces = "application/json")
public String setHeader(HttpServletRequest request) {
return "{key:value}";
}
3.3.2 设置状态码
代码:
@RequestMapping(value = "setStatus")
public String setStatus(HttpServletResponse response) {
int status = 345;
response.setStatus(status);
return "状态码设置成功: " + status;
}
结果:
3.3.3 设置User-Agent
代码:
@RequestMapping(value = "setHeader2", produces = "application/json")
public String setHeader2(HttpServletResponse response) {
response.setHeader("User-Agent", "abc");
return "{key:value}";
}
结果:
3.3.4 添加Header信息
代码:
@RequestMapping(value = "setHeader3", produces = "application/json")
public String setHeader3(HttpServletResponse response) {
response.setHeader("MyHeader", "2024qyy");
return "{key:value}";
}
结果:
四、两个Demo
4.1 计算器
4.1.1 后端接口
响应数据:两数之和
数据类型:text
4.1.2 前端接口
请求路径:user/login
请求方式:get/post
接口描述:计算两数之和
请求参数:
参数 | 描述 | 类型 | 是否必传 |
---|---|---|---|
num1 | 加数1 | Integer | 是 |
num2 | 加数2 | Integer | 是 |
响应数据:两数之和
4.1.3 后端代码
package com.example.springmvcdemo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/calc")
@RestController
public class CalcController {
@RequestMapping("sum")
public String sum(Integer num1, Integer num2) {
Integer sum = num1+num2;
return "两数之和:"+ sum;
}
}
4.2 用户登录
4.2.1 后端接口
登录接口:
响应数据:登录是否成功
数据类型:Boolean
获取用户名接口:
响应数据:用户名
数据类型:text
4.2.2 前端接口
登录接口:
请求路径:user/login
请求方式:post
接口描述:验证用户登录是否成功
请求参数
参数 类型 说明 是否必传 userName String 用户名 是 password String 密码 是
获取用户名接口:
请求路径:user/index
请求方式:get
接口描述:获取用户名
请求参数:不需要参数
4.2.3 后端代码
package com.example.springmvcdemo.controller;
import jakarta.servlet.http.HttpSession;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttribute;
@RestController
@RequestMapping("/user")
public class UserController {
/**
* 用户登录
* @param userName
* @param password
* @param session
* @return
*/
@RequestMapping("/login")
public Boolean login(String userName, String password, HttpSession session) {
if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)) {
return false;
}
System.out.println("接收到用户名:"+userName);
System.out.println("接收到密码:"+password);
if (!"admin".equals(userName) || !"password".equals(password)) {
return false;
}
// 保存到session中——key一定要带引号
session.setAttribute("userName", password);
return true;
}
/**
* 获取登录用户名
* @param userName 之前保存在Session中的用户名,进行取出
* @return
*/
@RequestMapping("/index")
public String getUserName(@SessionAttribute("userName") String userName) {
return userName;
}
}
4.2.4 前端代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<h1>用户登录</h1>
用户名:<input name="userName" type="text" id="userName"><br>
密码:<input name="password" type="password" id="password"><br>
<input type="button" value="登录" onclick="login()">
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
function login() {
$.ajax({
type: "post",
url: "/user/login",
data:{
userName:$("#userName").val(),
password:$("#password").val(),
},
success:function (result) {
if (result) {
location.href = "/index.html";
alert("跳转成功!");
}else {
alert(JSON.stringify(userName));
alert(JSON.stringify(password));
alert("用户名或密码错误");
}
}
});
}
</script>
</body>
</html>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>用户登录首页</title>
</head>
<body>
登录人: <span id="loginUser"></span>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script>
$.ajax({
type:"get",
url:"/user/index",
success:function (userName) {
$("#loginUser").text(userName);
}
});
</script>
</body>
</html>