目录
1.传递JSON数据
传递JSON对象
2.获取URL中的参数@PathVariable
3.上传文件@RequestPart
4.获取Cookie/Session
(1)获取Cookie
简洁获取Cookie
(2)获取Session
Sesson读取
简洁获取Session(1)
简洁获取Session(2)
5.获取Header
简洁获取Header
1.传递JSON数据
JSON概念
JSON :JavaScript Object Notation(javaScript对象表示法)
JSON是一种轻量级的数据交互格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储表示数据.
简单来说:JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不语言中数据传递和交换.
JSON语法
我们先来看一段JSON数据
{"squadName": "Super hero squad","homeTown": "Metro City","formed": 2016,"secretBase": "Super tower","active": true,"members": [{"name": "Molecule Man","age": 29,"secretIdentity": "Dan Jukes","powers": ["Radiation resistance", "Turning tiny", "Radiation
blast"]}, {"name": "Madame Uppercut","age": 39,"secretIdentity": "Jane Wilson","powers": ["Million tonne punch", "Damage resistance", "Superhuman
reflexes"]}, {"name": "Eternal Flame","age": 1000000,"secretIdentity": "Unknown","powers": ["Immortality", "Heat Immunity", "Inferno",
"Teleportation", "Interdimensional travel"]}]}
JSON的语法:
1.数据在键值对(key/value)中
2.数据由逗号,分隔
3.对象用{}表示
5.值可以为对象,也可以为数组,数组中可以包含多个对象.
传递JSON对象
接受JSON对象,需要使用@RequestBody注解
?RequestBody:请求正文,意思是这个注解作用在请求正文的数据绑定,请求参数必须写在请求正文中
后端实现:
@RequestMapping("/m1")public Object method1(@RequestBody Person person) {return person.toString();}
2.获取URL中的参数@PathVariable
Path Variable:路径变量
和字面表达的意思一样,这个注解主要作用在请求URL路径上的数据绑定
默认传递参数写在URL上,Spring MVC就可以获取到
后端代码实现:
@RequestMapping("/m2/{id}/{name}")public String method2(@PathVariable Integer id,@PathVariable("name") String userName) {return "解析参数id" + id + ",name: "+ userName;}
使用浏览器发送请求: 127.0.0.1:8080/test/m2/2/zhangsan
响应:
3.上传文件@RequestPart
后端代码实现:
@RequestMapping("/m3")public String getfile(@RequestParam("file") MultipartFile file) throws IOException {String fileName = file.getOriginalFilename();file.transferTo(new File("D:\\javaAdvanced"+file.getOriginalFilename()));return "接收到文件名称为: " + fileName;}
使用postman发送请求:
4.获取Cookie/Session
HTTP 协议自身是属于"无状态"协议.
"无状态" 的含义指的是: 默认情况下HTTP协议的客户端和服务器之间的这次通信,和下次通信之间没有直接联系.
但实际开发中,我们很多时候是需要知道请求之间的关联关系的.
例如: 登陆网站成功后,第二次,第二次访问的时候服务器就能知道该请求是否是已经登陆过了.
上述图中的"令牌"通常就存储在Cookie字段中.
理解Session
我们先来了解一下什么是会话
会话:对话的意思
在计算机领域,会话是一个客户与服务器之间的不中断的请求响应.对客户的每个请求,服务器能够识别出请求来自于同一个客户.当一个未知的客户向Web应用程序发送一个请求时就开始了一个会话.当客户明确结束会话或服务器在一个时限内没有接收到客户的任何请求时,会话就结束了.
服务器同一时刻收到的请求是很多的.服务器需要清楚的区分每个请求时从属于哪个用户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系:
Session是服务器为了保存用户信息而创建的一个特殊对.
Session的本质就是一个"哈希表",存储了一些键值对结构.Key就是SessionID,Value就是用户信息(用户信息可以根据需求灵活设计).
SessionID是由服务器生成的一个"唯一性字符串",从Session机制的角度来看,这个唯一性字符串称为"Session".但是站在整个登录流程中看待,也可以把这个唯一性字符串称为"token"
1.当用户登录的时候,服务器在Session中新增一个新记录,并把sessionID返回给客户端(通过HTTP响应中的Set-Cookie字段返回).
2.客户端后续再给服务器发送请求的时候,需要再请求中带上sessionID.(通过HTTP请求中的Cookie字段带上).
3.服务器收到请求之后,根据请求中的sessionID在Session信息中获取到对应的用户信息,再进行后续操作,找不到则重新创建Session,并把SessionID返回.
Session默认是保存在内存中的.如果重启服务器则Session数据就会丢失.
Cookie和Session的区别(面试题)
1.Cookie是客户端保存用户信息的一种机制.Session是服务器保存用户信息的一种机制.
2.Cookie和Session之间主要是通过SessionID关联起来的,SessionID是Cookie和Session之间的桥梁.
3.Cookie和Session经常会在一起配合使用.但是不是必须配合.
1)完全可以用Cookie来baocun一些数据在客户端.这些数据不一定是用户身份信息,也不一定是SessionID
2)Session中的sessionID也不需要非得通过Cookie/Set-Cookie传递,不如通过URL传递.
(1)获取Cookie
传统获取Cookie
@RequestMapping("/m1")public String method1(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响应的信息都在这个对象中,比如向客户端发送的数据,响应头,状态码等.通过这个对象提供的方法.可以获得服务器响应的所有内容
Spring MVC在这两个对象的基础上进行了封装,给我们提供了更加简单的使用方法.
此时没有设置cookie,通过浏览器访问:http://127.0.0.1:8080/test/m1,得到Cookie为null
我们设置一下Cookie的值
再次访问:
从这个例子中,可以看出Cookie是可以伪造的.也就是不安全的,所以使用Cookie时,后端需要进行校验.
简洁获取Cookie
@RequestMapping("/getCookie")public String cookie(@CookieValue("xg") String xg) {return "xg" + xg;}
运行结果: 127.0.0.1:8080/test/getCookie
(2)获取Session
Session也是服务器端的机制,我们需要先存储,才能再获取
Session也是基于HttpServletRequest来存储和获取的
Session存储
@RequestMapping("/setSess")public String setsess(HttpServletRequest request) {//获取Session对象HttpSession session = request.getSession();if(session != null) {session.setAttribute("userName","java");}return "session存储成功";}
这个代码中看不到SessionID这样的概念的.getSession操作内部提取到请求中的Cookie里的SessionID,然后根据SessionID获取到对应的Session对象,Session对象用HttpSession来描述
获取Session有两种方式
HttpSession getSesson(boolean create)
HttpSession getSession();
HttpSession getSession(boolean create) : 参数如果为true,则当不存在会话时新建会话;参数如果为false,则当不存在会话时返回null.
HttpSession getSession() : 和 getSession(true) 含义一样,默认值为true.
void setAttribute(String name,Object value) : 使用指定的名称绑定一个对象到该session会话
Sesson读取
读取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;}
Object Attribute(String name) : 返回在该session会话中具有指定名称的对象,如果没有指定名称的对象,则返回null.
运行
先设置Session: http://127.0.0.1:8080/test/setSess
获取Session: http://127.0.0.1:8080/test/getSess
简洁获取Session(1)
@RequestMapping("/getSess2")public String sess2(@SessionAttribute(value = "userName",required = false) String userName) {return "userName" + userName;}
运行: http://127.0.0.1:8080/test/getSess2
简洁获取Session(2)
通过Spring MVC内置对象HttpSession来获取
@RequestMapping("/getSess3")public String sess3(HttpSession session) {String userName = (String) session.getAttribute("userName");return "userName: " + userName;}
运行: http://127.0.0.1:8080/test/getSess3
Session不存在的话,会自动进行创建
5.获取Header
传统获取Header
获取header也是从HttpServletRequest中获取
@RequestMapping("/getHeader")public String getHeader(HttpServletRequest request,HttpServletResponse response) {String uerAgent = request.getHeader("User-Agent");return "uerAgent" + uerAgent;}
使用getHeader方法来获取
运行: http://127.0.0.1:8080/test/getHeader
简洁获取Header
@RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent") String userAgent) {return "userAgent: " + userAgent;}
运行: http://127.0.0.1:8080/test/getHeader2
@RequesetHeader注解的参数值为HTTP请求报头中的"Key"