文章目录
Cookie
获取方法1:通过request和response对象
通过调用HttpServletRequest和HttpServletRespon对象的getCookies.,这是一个比较传统的方法,下面获取Session或者header都可使用这个方法,通过获取请求和响应对象,调用getSession或者getHeader方法来得到具体参数。
获取Cookie:
@GetMapping("/getCk")
public Cookie[] getCookie(HttpServletRequest request, HttpServletResponse response){
Cookie[] cookies=request.getCookies();
return cookies;
}
输出:
获取方法2:使用注解(更简单、快速)
使用注解@CookieValue
直接获取Cookie的值:
@GetMapping("/getCk2")
@ResponseBody
public String getCookie(@CookieValue("Idea") String Idea){
return Idea;
}
运行结果:
Session
储存Session:
调用request请求对象,调用getSession方法,获取session对象,并将参数设为true.
如果不为空,调用setAttribute方法添加一个session。
//存取session
@RequestMapping("/setsession")
public String setSession(HttpServletRequest request){
//获取session对象,设置参数为true,表示如果拿不到session对象,那么创建一个session
HttpSession session=request.getSession(true);
if(session !=null){
session.setAttribute("username","Java");
}
return "储存session成功!";
}
读取Session:
方法1:
传统方法,获取请求对象进行方法调用。
//读取session
@RequestMapping("/getsession")
public String getSession(HttpServletRequest request){
String username="暂时为空";
//获取Session对象,设置参数为false,表示如果拿不到session对象,也不会创建一个新的对象
HttpSession session =request.getSession(false);
if(session !=null && session.getAttribute("username")!=null){
username=(String)session.getAttribute("username");
}
return username;
}
方法2:
使用注解@SessionAttribute
,设置value,required设为false,非必传参数。
@RequestMapping("/getses2")
public String getSession2(@SessionAttribute(value ="username",required = false) String username){
return username;
}
header
方法1:
比较传统的一个方法,通过HttpServletRequest对象,调用getHeader方法,和上面获得Cookie的方法相同。
@RequestMapping("/gethd")
@ResponseBody
public String gethd(HttpServletRequest request,HttpServletResponse response){
String userAgent=request.getHeader("User-Agent");
return "读取到的header(userAgent)内容是:"+userAgent;
}
运行结果:
方法2:
使用注解@RequestHeader
:
@RequestMapping("/getua")
public String getUserAgent(@RequestHeader("User-Agent") String userAgent){
return userAgent;
}
运行结果:
和上面方法1获得的结果一模一样。
返回请求参数
默认情况下,无论是Spring MVC还是Spring Boot返回的都是视图,即xxx.html,为了做到前后端分离,后端只给前端返回数据,我们可以使用@ResponseBody注解
@ResponseBody详解
@ResponseBody是使用在Controller(控制器层)的方法注解。
在控制器的方法中,如果不加这个注解,仅仅是给这个方法映射了路由,那么方法会默认返回一个视图,方法的返回值会作为视图名称,自动匹配响应的视图去显式。
如果加上这个注解,会直接将方法的返回值作为内容直接返回给用户,并且自适应响应头的content-type,如果是普通的字符串,就是text/html格式,如果返回的字符串符合json,那么content-type就是application/json格式。
总结:
@ResponseBody注解的作用:将方法的返回值,以特定的格式写入到response的body区域,进而将数据返回给前端。
text/html非视图数据
@ResponseBody //这个注解的作用就是将默认return的视图形式的数据转换成text文本或者html形式的数据
@RequestMapping("/gethtmlmess")
@ResponseBody //这个注解的作用就是将默认return的视图形式的数据转换成text文本或者html形式的数据
public String method(){
return "<h3>这是一个HTML类型的信息,h3标题大小<h3>";
}
使用fiddler抓包,可以看到返回的数据格式是text/html类型。
返回静态页面(xxx.html类型)
在resources路径下创建一个html文件:
在index.html中写入以下代码:
<html>
<head>
<meta charset="utf8">
</head>
<body>
<h3>这是一个HTML类型的静态页面!</h3>
<form>
<p></p>
<p></p>
<h3>无法在页面上进行操作和互动.</h3>
</form>
</body>
</html>
在控制层,即Controller类中写一个方法,用户在url输入请求后会映射到这方法上,最后返回的就是上面创建的html,在返回一个html类型的静态文件时,需要在名称前加“/”,代码如下:
package com.example.demo.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/index")
public Object deal(){
//do something..
//返回视图:index.html静态页面
return "/index.html"; //前面需要添加一个"/",否则认定是字符串
}
}
在浏览器中访问时运行结果:
返回Json对象
举例:
@RequestMapping("/getjson")
@ResponseBody
public Object getJson(String name){
HashMap<String,Object> map=new HashMap<>();
map.put("name",name);
map.put("ctime", LocalDateTime.now());
return map;
}
输入Url访问结果:
抓包后查看返回请求的content-type,是application/json格式:
请求转发和重定向
在Spring MVC中,renturn返回时不仅可以返回一个视图,还可以实现跳转。
跳转请求的方式有两种:转发(forward)和重定向(redirect)。
请求转发流程:
请求转发(Forward)是服务器内部的一种行为,转发后访问的资源也只能是服务器内部的资源,不能访问外部的资源。
转发是服务器请求资源,直接访问目标地址的URL,然后把响应内容给读取过来在发送给浏览器,浏览器并不知道响应内容的来源,所以url没有发生改变。就像考试的时候,老师给了你一张卷子,你抄了同桌的答案,但老师不知道你是抄了别人的答案,给你的分数还是不变的。
代码:
假设某位b站用户没有登录就想刷视频,会跳转到登录界面,会跳转到登录界面loginxxx.html:
@Controller
@RequestMapping("/ret")
public class TestController {
@RequestMapping("/add")
public String forward(){
System.out.println();
System.out.println("正在进行请求转发forward操作");
System.out.println();
//假设用户没有登录,跳转到login.html登录界面。
return "forward: login.html";
}
}
请求重定向流程(Redirect):
请求重定向(Redirect)是客户端的一种行为,服务器会根据逻辑发送一个状态码,告诉浏览器重新请求地址,所以在浏览器中会显示新的URL.
重定向从本质上来说是两次request,第一次的时候,用户/客户端request A,服务器响应,然后response结果,告诉浏览器,你应该访问B,此时地址栏中的URL就会发生改变。然后浏览器会开始第二次的请求request B,服务器返回新的response.
使用:
return时直接加上redirect:/重定向地址
@RequestMapping("/add2")
public String redirect(){
System.out.println();
System.out.println("正在进行请求重定向");
System.out.println();
return "redirect:/login.html";
}
Forward(转发)和Redirect(重定向)的区别
从四个方面考虑区别:
- 访问地址:forward的整个过程是服务器行为,与客户端无关,所以地址栏中的URL没有发生改变。而Redirect是客户端行为,客户端重新请求地址,所以URL是新的URL.
- 数据共享 :forward过程中,跳转前的页面和跳转后的页面后可以共享一个请求request中的数据,而redirect不能共享数据。
请求转发的过程中,外部资源可能会丢失(css样式、图片等),访问不到;而在请求重定向的时候不存在外部资源丢失的情况,和直接访问目标地址是的效果相同。 - 应用的场景 :请求转发一般用于登录跳转,而重定向一般用于跳转到其他网站、注销登录返回原来的页面。
- 运行效率 :跳转的运行效率高、而重定向的运行效率低。