大家好,我叫小帅今天我们来继续Spring Boot的内容。
文章目录
- 1. 获取JSON对象
- 2. 获取URL中参数@PathVariable
- 3.上传⽂件@RequestPart
- 3. 获取Cookie/Session
- 3.1 获取和设置Cookie
- 3.1.1传统获取Cookie
- 3.1.2简洁获取Cookie
- 3. 2 获取和存储Session
- 3.2.1获取Session(1)使⽤ HttpServletRequest
- 3.2.2简洁获取 Session(1) @SessionAttribute(value = "username",required = false)
- 3.2.2简洁获取 Session(2)
- 4. 获取Header
- 4.1传统获取 header
- 4.2简洁获取 Header (@RequestHeader("User-Agent") 里面参数是header里面的键值对的Key)
1. 获取JSON对象
接收JSON对象, 需要使⽤ @RequestBody 注解,作用是这个 方法或者类是返回正文
但是@RestController = @RequestBody + @Controller所以我们使用@RestController就可以。
代码:
@RestController
@RequestMapping("/test")
public class test {
//produces参数是返回JSON字符串
@RequestMapping(value = "/getUser", produces = "application/json")
public String getUser() {
User user = new User("111111", "111111");
return user.toString();//字符串的方式返回
}
//consumes参数是传过来JSON字符串(可以是格式化的JOSN字符串)
@RequestMapping(value = "/setUser",
produces = "application/json", consumes = "application/json")
public String setUser(String name, String password) {
User user = new User(name, password);
return user.toString();
}
}
后端正确接收了
通过Fiddler观察⼀下请求参数效果:
get:
post:
2. 获取URL中参数@PathVariable
path variable: 路径变量
和字⾯表达的意思⼀样, 这个注解主要作⽤在请求URL路径上的数据绑定
默认传递参数写在URL上,SpringMVC就可以获取到.
后端实现代码:
@RequestMapping("/get/{name}/{password}")
public String method8(@PathVariable String name,
@PathVariable("name") String password){
return "解析路径:name:" + name + ",password:" + password;
}
是postman发送请求:
3.上传⽂件@RequestPart
后端代码实现:
@RequestMapping("getFile")
public String pushFile(@RequestPart("file") MultipartFile file) throws IOException {
//获取文件名称
String fileName = file.getOriginalFilename();
return fileName;
}
效果:
上传成功了。
3. 获取Cookie/Session
理解cookie
HTTP 协议⾃⾝是属于 “⽆状态” 协议.
“⽆状态” 的含义指的是:
默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信, 和下次通信之间没有直接的联系.
但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的.
例如登陆⽹站成功后, 第⼆次访问的时候服务器就能知道该请求是否是已经登陆过了.
上述图中的 “令牌” 通常就存储在 Cookie 字段中。
比如说,我现在访问了csdn,现在我又退了出去,这个时候浏览器就自动保存了一个身份标识。
理解Session
我们先来了解⼀下什么是会话,就是对话的意思。
会话是⼀个客⼾与服务器之间的不中断的请求响应. 对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客⼾. 当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了.
Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象.
服务器需要清楚的区分每个请求是属于哪个⽤⼾, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系.
Session的本质就是⼀个 “哈希表”, 存储了⼀些键值对结构. Key 就是SessionID, Value 就是⽤⼾信息(⽤⼾信息可以根据需求灵活设计).
- 当⽤⼾登陆的时候, 服务器在 Session 中新增⼀个新记录, 并把 sessionId返回给客⼾端. (通过HTTP 响应中的 Set-Cookie 字段返回).
- 客⼾端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的Cookie 字段带上).
- 服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的⽤⼾信息, 再进⾏后续操作.找不到则重新创建Session, 并把SessionID返回。
Cookie 和 Session 的区别
- Cookie 是客⼾端保存⽤⼾信息的⼀种机制. Session 是服务器端保存⽤⼾信息的⼀种机制.
- Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁。
- cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合。
- 完全可以⽤ Cookie 来保存⼀些数据在客⼾端. 这些数据不⼀定是⽤⼾⾝份信息, 也不⼀定是SessionId。
- Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递.
3.1 获取和设置Cookie
3.1.1传统获取Cookie
代码:
@RequestMapping("/getCookie")
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;
}
解释:
Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的
HttpServletRequest , HttpServletResponse 是Servlet提供的两个类, 是Spring MVC⽅法的内置对象. 需要时直接在⽅法中添加声明即可.
HttpServletRequest对象代表客⼾端的请求, 当客⼾端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信息.
HttpServletResponse对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾
端发送的数据, 响应头, 状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容
看看效果:
此时没有设置Cookie, 通过浏览器访问: http://127.0.0.1:8080/test/getCookie,得到Cookie为null
我们设置⼀下Cookie的值,键盘f12
再次访问:
从这个例⼦中, 也可以看出Cookie是可以伪造的, 也就是不安全的, 所以使⽤Cookie时, 后端需要进⾏Cookie校验
3.1.2简洁获取Cookie
@RequestMapping("/getCookie2")
public String cookie(@CookieValue("cdm") String cdm) {
return "Cookie:" + cdm;
}
效果:
3. 2 获取和存储Session
Session是服务器端的机制, 我们需要先存储, 才能再获取
Session 也是基于HttpServletRequest 来存储和获取的
Session的存储
代码:
//存储Session
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request) {
// 获取Session对象
HttpSession session = request.getSession();
if (session != null) {
session.setAttribute("username", "java");
}
return "session 存储成功";
}
解释:
void setAttribute(String name, Object value): 使⽤指定的名称绑定⼀个对象到该 session 会话
效果:
获取Session
获取Session有两种⽅式:
- HttpSession getSession(boolean create);
- HttpSession getSession();
HttpSession getSession(boolean create): 参数如果为 true, 则当不存在会话时新建会话; 参数如果为 false, 则当不存在会话时返回 null
HttpSession getSession(): 和getSession(true) 含义⼀样, 默认值为true
3.2.1获取Session(1)使⽤ HttpServletRequest
//存储Session
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request) {
// 获取Session对象
HttpSession session = request.getSession();
if (session != null) {
session.setAttribute("username", "java");
}
return "session 存储成功";
}
//获取session
@RequestMapping("/getSession")
public String session(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;
}
Object getAttribute(String name): 返回在该 session 会话中具有指定名称的对象,如果没有指定名
称的对象,则返回 null.
HttpServletRequest request 如果 session 不存在, 不会⾃动创建
效果:
3.2.2简洁获取 Session(1) @SessionAttribute(value = “username”,required = false)
代码:
//获取session
@RequestMapping("/getSession2")
public String getSession2(@SessionAttribute(value = "username",required = false)
String username) {
//获取到session字符串,直接返回
return "username:" + username;
}
解释:value是:获取username的值,required是:没有Session对象时,不创建,返回null
效果:
3.2.2简洁获取 Session(2)
代码:
//获取session
@RequestMapping("/getSession3")
public String getSession3(HttpSession session) {
//获取到session对象
String username = (String)session.getAttribute("username");
return "username:" + username;
}
解释:HttpSession session获取到session对象
效果:
4. 获取Header
4.1传统获取 header
获取Header也是从 HttpServletRequest 中获取
效果:
通过Fiddler观察, 获取的User-Agent是否正确
4.2简洁获取 Header (@RequestHeader(“User-Agent”) 里面参数是header里面的键值对的Key)
比如说获取User-Agent:
代码:
//获取header
@RequestMapping("/getUserAgent2")
public String getUserAgent2(@RequestHeader("User-Agent") String userAgent) {
return "User-Agent" + userAgent;
}
再比如获取Host
好了,今天就到在这里,感谢观看。