【Spring MVC】如何获取cookie/session以及响应@RestController的理解,Header的设置

前言

🌟🌟本期讲解关于SpringMVC的编程之参数传递~~~

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

🔥 你的点赞就是小编不断更新的最大动力

🎆那么废话不多说直接开整吧~~

目录

📚️1.请求

1.1了解Cookie与Session

1.2获取Cookie

1.传统的方式

2.注解的方式

1.3获取Session

1.传统的方式

2.注解的方式

1.4获取Header

1.传统的方式

2.注解的方式

📚️2.响应

2.1返回静态页面

2.2@RestController与@Controller的区别

2.3设置状态码

2.4设置Header

📚️3.总结


📚️1.请求

1.1了解Cookie与Session

回顾之前我们学习过的cookie,我们知道这是用于浏览器与页面存储某些信息的部分,而HTTP 协议⾃⾝是属于 "⽆状态" 协议

无状态:默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信, 和下次通信之间没有直接的联系.

但是在实际开发中,在第一次用户登录后是要存储用户的信息的,第⼆次访问的时候服务器就能知道该请求是否是已经登陆过了.具体的情况就是如下所示:

解释:

上面的令牌就是存储在cookie中的,下次访问服务器的时候,就要带上cookie中的"令牌",此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的⽤⼾信息, 这个就是 Session 机制所做的⼯作.

理解session

我们先来了解⼀下什么是会话.会话: 对话的意思

解释:

会话是⼀个客⼾与服务器之间的不中断的请求响应. 对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客⼾.

当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了

总结:

服务器需要清楚的区分每个请求是属于哪个⽤⼾, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系.

所以session就是服务器用来保存用户信息而创建的一个特殊的对象;

Session的本质就是⼀个 "哈希表", 存储了⼀些键值对结构. Key 就是SessionID, Value 就是⽤⼾信息(⽤⼾信息可以根据需求灵活设计

此时cookie和session就可以合作来完成这个过程:

解释:

1,首先客户端发送请求后,服务器就会返回创建一个session,然后把sessionID通过setcookie放回给客户端,存在客户端中cookie里。

2.当客户端第二次进行访问的时候,就会带上cookie,发送请求

3.此时服务器就会拿到里面的sessionID这个key,然后查找session这个对象,返回给客户端

这两者的区别:

• Cookie 是客⼾端保存⽤⼾信息的⼀种机制. Session 是服务器端保存⽤⼾信息的⼀种机制.
• Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁
• Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合.

1.2获取Cookie

1.传统的方式

代码如下所示:

java 复制代码
 public String request10(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        if(cookies!=null){
            Arrays.stream(cookies).forEach(cookie -> {
                System.out.println(cookie.getName()+":"+cookie.getValue());
            });
        }
        return "获取到cookie";
    }

解释:

Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的;

HttpServletRequest 对象代表客⼾端的请求, 当客⼾端通过HTTP协议访问服务器时,HTTP请

求头中的所有信息都封装在这个对象中

HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾

端发送的数据, 响应头, 状态码等

这里获取到cookie后,转化为数据流的方式,进行增强循环实现打印;

当我们进行测试后:

此时就能够在下面的面板中得到这里的字符串,但是有由于没有设置,所以我们能够自己进行设置cookie的值,此时我们可以在浏览器中进行修改:

此时我们再次启动刷新·:

我们就可以在控制面板进行观察了~~

2.注解的方式

这里spring进行分装,此时就可以使用注解代替,但是这种方式只能获取指定的cookie,具体的代码就是如下所示:

java 复制代码
  @RequestMapping("r11")
    public String request11(@CookieValue("nihao") String nihao){
        return "nihao的cookie值:"+nihao;
    }

此时我们就可以拿到cookie中"nihao"的value值:

那么就可以拿到返回的cookie值了;

1.3获取Session

我们知道session是服务器的,此时我们就不能在客户端浏览器进行修改,所以此时我们就在代码中先设置session的值,这里和上面的cookie大差不差;

java 复制代码
@RequestMapping("r13")
    public String request13(HttpServletRequest request){
        HttpSession session=request.getSession();
        session.setAttribute("name","zhangsan");
        return "session设置成功";
    }

此时我们就可以通过httpservletrequest来进行设置;还有这里的session是一个键值对的形式,所以要有两个参数;

那么接下来我们就可以获取session了:

1.传统的方式
java 复制代码
 @RequestMapping("r12")
    public String request(HttpServletRequest request){
         HttpSession session= request.getSession();
         String name=(String) session.getAttribute("name");
         return "获取到了session:"+name;
    }

这里也是通过HttpServletRequest 来进行操作,输入对应的key的值"value"来进行操作,我们进行postman进行测试获取:

那么就可以看到拿到了session的值,

2.注解的方式

此时和上面一致,进行了封装,那么此时我们就可以拿到session的值了,并且代码更加的简单

java 复制代码
 @RequestMapping("r16")
    public String request16(@SessionAttribute("name") String name){
        return "获取到了session"+name;
    }

这里还是只能获取对应的key值的value,通过参数来接收这里的session的值;这里小编就不在进行演示了

注意:若没有获取到session的值,并且为null,很有可能就是刷新了浏览器,由于session是存储来内存中的,所以此时我们就要重新再次建立session,然后再获取session;

1.4获取Header

这里还是一样的,我们知道HttpServletRequest包含了所有请求头中的所有相关的信息,此时也可以通过这个来进行某个属性的获取;

1.传统的方式

代码如下:

java 复制代码
 @RequestMapping("r17")
    public String request17(HttpServletRequest httpServletRequest){
        String contentType=httpServletRequest.getHeader("Content-Type");
        return contentType;
    }

注意:此时我们直接进行操作,是不会得到任何的数据,这里代表就是数据传输的方式,此时我们需要在postman中进行数据的编写:

此时我们再次点击发送,那么此时的数据传输就是JSON的格式了:

2.注解的方式

代码如下所示:

java 复制代码
@RequestMapping("r18")
    public String request18(@RequestHeader("Content-Type") String contentType){
        return contentType;
    }

这里和上面几乎是一致的,还是一样的返回指定content-type,那么所以小编就不再进行演示和赘述了;

📚️2.响应

2.1返回静态页面

首先我们需要进行html的设置,代码如下:

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Index⻚⾯</title>
</head>
<body>
 Hello,Spring MVC,我是Index⻚⾯.
</body>
</html>

此时我们规定的后端代码就是如下所示:

java 复制代码
@RestController
@RequestMapping("response")
public class ResponseController {
    @RequestMapping("jump")
    public String response1(){
        return "/index.html";
    }

此时我们进行输出后,返回就是如下所示的:

此时我们想要返回的是一个html页面,结果这里当成了数据进行返回了,那么此时我们就可以通过更改注解名的方式进行操作

java 复制代码
@Controller
@RequestMapping("response")
public class ResponseController {
    @RequestMapping("jump")
    public String response1(){
        return "/index.html";
    }

解释:

此时就是将上面的restcontroller进行了更改为controller,那么此时就可以进行html的页面的跳转了,那么这是问什么呢,下面小编将进行讲解

2.2@RestController与@Controller的区别

随着互联⽹的发展, ⽬前项⽬开发流⾏"前后端分离"模式, Java主要是⽤来做后端项⽬的开发, 所以也就不再处理前端相关的内容了

MVC的概念也逐渐发⽣了变化, View不再返回视图, ⽽是返回显⽰视图时需要的数据.

所以:@RestController 其实是返回的数据

java 复制代码
@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Documented
@org.springframework.stereotype.Controller
@org.springframework.web.bind.annotation.ResponseBody
public @interface RestController {
    @org.springframework.core.annotation.AliasFor(annotation = org.springframework.stereotype.Controller.class)
    java.lang.String value() default "";
}

解释:

上面的代码最重要的就是代表了如下:

@RestController = @Controller + @ResponseBody

所以:如果想返回视图的话, 只需要把 @ResponseBody 去掉就可以了, 也就是 @Controller ,这里的@ResponseBody 代表就是返回数据据

注意:

@ResponseBody:这既可以用作类,也可以用在方法上面,代表就是返回的是数据,如果上面的@RestController被@Controller代替后,想要返回数据,不是视图,那么就可以使用@ResponseBody加在方法上面;

@Controller不能用在方法上面,如下图所示:

2.3设置状态码

Spring MVC会根据我们⽅法的返回结果⾃动设置响应状态码, 程序员也可以⼿动指定状态码

通过Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置

代码如下:

java 复制代码
 @RequestMapping("setstatus")
    @ResponseBody
    public String setstatus(HttpServletResponse httpServletResponse){
        httpServletResponse.setStatus(401);
        return "状态码设置成功";
    }

此时我们使用postman进行发送请求,用fiddler进行抓包:

可以发现,状态码本来因该是200,但是被修改后成为了401;所以状态码不一定会影响是否响应成功;

2.4设置Header

这里小编就直接步入正题吧:

我们首先看看这个@RequestMapping的内部的原码;

java 复制代码
 java.lang.String name() default "";

    @org.springframework.core.annotation.AliasFor("path")
    java.lang.String[] value() default {};

    @org.springframework.core.annotation.AliasFor("value")
    java.lang.String[] path() default {};

    org.springframework.web.bind.annotation.RequestMethod[] method() default {};

    java.lang.String[] params() default {};

    java.lang.String[] headers() default {};

    java.lang.String[] consumes() default {};

    java.lang.String[] produces() default {};

解释:

1.value: 指定映射的URL

  1. method: 指定请求的method类型, 如GET, POST等

  2. consumes: 指定处理请求(request)的提交内容类型(Content-Type),例如application/json,

text/html;

  1. produces: 指定返回的内容类型,还可以同时设置返回值的字符编码

  2. Params: 指定request中必须包含某些参数值时,才让该⽅法处理

  3. headers: 指定request中必须包含某些指定的header值,才能让该⽅法处理请求

其实在上面有几个是小编之前讲解到的,这里就举几个其他的例子:

produce:规定返回的内容的类型:

java 复制代码
@RequestMapping(value = "/returnJson2",produces = "application/json")
    @ResponseBody
    public String returnJson2() {
        return "ji";
    }

此时我们进行抓包处理:

可以看到此时就是JSON的格式;

method指定请求的方法:

java 复制代码
@RequestMapping(value = "/method",method = RequestMethod.POST)
    public String method(){
        return "方法观察";
    }

此时我们使用postman进行发送请求

此时若为get方法,那么就会出现方法不被允许的错误,所以在我们更改请求的方法后:

我们进行抓包,可以看到此时的结果就是如下所示:

那么此时就是:抓包的结果,可以看到请求的方法就是post;

📚️3.总结

本期小编主要讲解了关于cookie和session的概念和如何进行获取的操作,这里包括了传统的代码编写方式,以及注解的代码编写的方式;还讲解了响应中比较重要的@RestController的概念理解,和状态码,Header的设置;

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

😊😊 期待你的关注~~~

相关推荐
Fighting042944 分钟前
java回文数
java·开发语言·力扣·策略模式
问道飞鱼44 分钟前
【Java知识】Java进阶-策略模式实现
java·开发语言·策略模式
2401_890666131 小时前
(免费送源码)计算机毕业设计原创定制:Java+SSM+JSP+Ajax+MySQLSSM国外鞋服代购平台
java·javascript·ajax·课程设计·idea·sqoop·tornado
请你打开电视看看1 小时前
结构型模式-外观模式
java·开发语言·外观模式
旧日之血_Hayter1 小时前
docker里的jenkins迁移
java·docker·jenkins
Duck Bro2 小时前
MySQL:表的增删改查(CRUD)
android·java·数据库·c++·mysql
BAGAE3 小时前
tomcat,appche,nginix,jboss区别
java·linux·数据库·ubuntu·tomcat
大梦百万秋3 小时前
Spring Boot开发实战:从入门到构建高效应用
java·spring boot
数懒女士3 小时前
Java常见的锁策略
java·算法