文章目录
- 一、使用 @RequestBody 接收JSON对象
- 二、使用 @RequestPart 上传⽂件
- 三、获取 Cookie
- 四、获取 Header
- 五、存储和获取 Session
- 5.1 存储 Session
- 5.2 获取 Session
一、使用 @RequestBody 接收JSON对象
有时客户端会通过 post 方式发送 json 格式的请求,那后端就可以通过 @RequestBody 注解来获取到 json 格式的请求
代码实现:
// 接受 json格式的请求 @RequestBody
@RequestMapping("/rename1")
public String rename1(@RequestBody String UserName) {
return UserName;
}
使用 postman 测试得:
此时我们可以看到,已经成功获取到了这个 json 对象
扩展:如何使用 postman 发送一个 json 格式的请求?
二、使用 @RequestPart 上传⽂件
示例一个基础场景,客户端用户通过id来修改头像
代码示例:
// 1.设置文件目录,从配置文件中获取
@Value("${img.path}")
private String imgpath;
@RequestMapping("/upimg")
// @RequestPart:表示上传的文件名参数 MultipartFile:表示用此接收
public boolean upImg(Integer id, @RequestPart("img") MultipartFile file) {
// 2.图片名称,不能重复【UUID:全局唯一id 不会重复】
String fileName = file.getOriginalFilename();//得到原图片名称
fileName = fileName.substring(fileName.lastIndexOf("."));//得到图片后缀,如.png .gif
fileName = UUID.randomUUID().toString() + fileName;//得到一个唯一的前缀再与后缀拼起来,就是唯一的图片名称
try {
// 此时是将接收到的文件保存在本地,如果部署到服务器后就是保存到服务器
file.transferTo(new File(imgpath + fileName));
return true;
} catch (IOException e) {
log.error("上传图片失败" + e.getMessage());
}
return false;
}
注意: 上述代码有两个重要的点 !!
- 设置图片文件保存的路径
- 设置图片的名称,确保它是唯一的
1.设置保存路径:
我们可以将文件保存路径设置在配置文件中,然后直接读取配置文件就行了,如下:
再通过 @Value(“${img.path}”) 读取就行 !!
拓展: 不同运行平台的配置文件设置
在实际开发中,我们经常会涉及多个平台共同开发 !!所有每一个平台也会有自己不同的配置文件。例如开发平台会配置自己的开发配置文件,测试平台可以设置自己的测试配置文件,当需要使用时就直接用主配置文件去切换就行,如下:
注意: 不同平台文件配置的命名规则
2.设置图片名称:
- 得到图片的后缀,.png/.GIF 等
- 使用 UUID 给图片生成一个唯一的前缀名
// 2.图片名称,不能重复【UUID:全局唯一id 不会重复】
String fileName = file.getOriginalFilename();//得到原图片名称
fileName = fileName.substring(fileName.lastIndexOf("."));//得到图片后缀,如.png .gif
fileName = UUID.randomUUID().toString() + fileName;//得到一个唯一的前缀再与后缀拼起来,就是唯一的图片名称
使用 postman 测试得:
此时我们去 保存的路径下观察:
三、获取 Cookie
- servlet 中获取 Cookie 的方法
@RequestMapping("/getcookie")
public void getCookie(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
for (Cookie item : cookies) {
log.info("Cookie Name:" + item.getName() + "| Cookie Value:" + item.getValue());
}
}
通过 servlet 方法是获取到所有Cookie !! 想要获取单个还得使用注解
- @CookieValue 获取 Cookie
@RequestMapping("getcookie1")
public String getCookie1(@CookieValue("bite") String cookie) {
return "Cookie Value: " + cookie;
}
当你想使用注解获取多个 Cookie 时,就多添加几个注解 !!
四、获取 Header
- servlet 中获取 Header 的方法
@RequestMapping("/getheader")
public String getHeader(HttpServletRequest request) {
return request.getHeader("User-Agent");
}
- 使用 @RequestHeader 获取 Header
@RequestMapping("/getheader1")
public String getHeader1(@RequestHeader("User-Agent") String header) {
return "Header:" + header;
}
同上,当你想使用 @RequestHeader 获取多个 Header 时,就多添加几个注解
五、存储和获取 Session
5.1 存储 Session
Session 存储和 Servlet 类似,是使⽤ HttpServletRequest 中获取的,如下代码所示:
@RequestMapping("/setsession")
public boolean setSession(HttpServletRequest request) {
boolean result = false;
//参数设置为 true 表示如果没有 session 对象就创建⼀个 session
HttpSession httpSession = request.getSession(true);
httpSession.setAttribute("userinfo", "zhangsan");
result = true;
return result;
}
我们可以在页面中 F12 进入调试控制台,观察应用程序中 Cookie 的变化,如下:
存储 Cookie 前
存储 Cookie 后
当存储 Session 后,Cookie 中多出来了一组数据 !此时这个 Cookie 就对应了刚才创建的 Session 的 SessionID。Session 会话的本质就是一个 “哈希表”, 存储了一些键值对结构. key 就是SessionID, value 就是用户信息(用户信息可以根据需求灵活设计),可以是一些键值对
5.2 获取 Session
- 使用 Servlet 方法 获取
@RequestMapping("/getsession")
public String getSession(HttpServletRequest request) {
String result = null;
HttpSession httpSession = request.getSession(false);
if (httpSession != null && httpSession.getAttribute("userinfo") != null) {
result = (String) httpSession.getAttribute("userinfo");
}
return result;
}
- 使用注解 @SessionAttribute 获取
@RequestMapping("/getsession1")
public String getSession1(@SessionAttribute(value = "userinfo", required = false) String session) {
return session;
}
设置 required = false,当Session中没有该属性就为null,不设置的话就会报错
之前我们讲过,Spring MVC 是基于 Servlet API 构建的原始 Web 框架,所以在 MVC项目中,我们可以直接使用 HttpServletRequest 以及 HttpServletResponse 等Servlet API