【spring】Cookie和Session的设置与获取(@CookieValue()和@SessionAttribute())

💐个人主页初晴~

📚相关专栏:程序猿的春天


获取Cookie

使用 Servlet 获取Cookie:

  • Spring MVC 是基于 Servlet API 构建的原始 Web 框架,也是在 Servlet 的基础上实现的
java 复制代码
@RestController
@RequestMapping("/cookie")
public class CookieController {
    @RequestMapping("/getcookie")
    public String getCookie(HttpServletRequest request){
        //获取所有 cookie的信息
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie:cookies){
            System.out.println(cookie.getName()+":"+cookie.getValue());
        }
        return "获取Cookie成功!";
    }
}
  • HttpServletRequest 对象代表客⼾端的请求, 当客⼾端通过HTTP协议访问服务器时,HTTP请 求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信 息.
  • HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾ 端发送的数据, 响应头, 状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容

HttpServletRequest , HttpServletResponse 是Servlet提供的两个类, 是Spring MVC⽅法的内置对象. 需要时直接在⽅法中添加声明即可
不过上述代码当没有设置Cookie,也就是Cookie为空时,会发生 500 的报错:

让我们设置一下Cookie的值:

此时在访问:

后端就能成功拿到Cookie的值了


使用注解 @CookieValue()获取Cookie

Spring MVC 在这两个对象的基础上进行封装,给我们提供更加简单的使用方法

java 复制代码
@RestController
@RequestMapping("/cookie")
public class CookieController {
    @RequestMapping("/getcookie2")
    public String getCookie2(@CookieValue("jay") String jay){
        return "成功获取到Cookie中的 jay:"+jay;
    }
}

不过这两种方式各有优劣:

  • 传统方法可以一次拿到多个Cookie对象
  • @CookieValue一次只能拿到一个指定的Cookie对象

获取Session

Session 存储和获取

  • 使用Servlet获取Session
java 复制代码
@Controller
@RequestMapping("/session")
public class SessionController {
    @RequestMapping("/getsession")
    public String getSession(HttpServletRequest request){
        //从Cookie中获取到了SessionId,根据SessionId获取对应的Session对象
        HttpSession session=request.getSession();
        //通过 getAttribute 获取需要的值
        String userName = (String)session.getAttribute("userName");
        return "获取到Session中的userName为:"+userName;
    }
}

不过由于Session是服务器端的机制,我们无法像Cookie那样直接在浏览器中伪造Session。我们需要先存储,才能再获取

Session存储

java 复制代码
@RequestMapping("/setsession")
public String setSession(HttpServletRequest request){
    //从 Cookie 中获取到了SessionId,根据 SessionId 获取Session对象
    //如果没有获取到,就会创建一个Session对象
    HttpSession session = request.getSession();
    session.setAttribute("userName","jay");
    return "设置session成功";
}

getSession() 可以设置一个布尔类型的参数:

  • getSession(true),如果Session对象为空,会创建一个空的Session对象
  • getSession(false),如果Session对象为空,不会创建Session

getSession默认值为空

因此当第一次调用 getSession() 时,就会自动创建一个空的Session对象 ,接着就可以通过setAttribute() 方法来设置Session了,前面表示 name ,后面表示 value

我们用Fiddler抓包看一下:

此时Session就创建好了,可以通过 SessionId 来获取 Session 的值了:

如果自己私自更改SessionId的值,就会导致后端无法获取 Session对象了:

简易方式获取Session:

(1)用 HttpSession 直接获取Session

java 复制代码
@RequestMapping("/getsession2")
public String getsession2(HttpSession session){
    String userName = (String) session.getAttribute("userName");
    return "从session中获取UserName:"+userName;
}

这样就不需要我们手动用 Request 调用getSession来获取 Session 对象了

(2)用 @SessionAttribute(" ") 注解获取对应元素值

java 复制代码
@RequestMapping("/getsession3")
public String getsession3(@SessionAttribute("userName") String userName){
    return "从session中获取userName:"+userName;

设置 @SessionAttribute(" ")注解 中的值就会获取Session对象中的对应元素值,从而省略了指定name 的步骤


那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

相关推荐
成为大佬先秃头9 分钟前
开放标准(RFC 7519):JSON Web Token (JWT)
spring boot·后端·json·jwt
xcbrand10 分钟前
文旅行业品牌策划公司找哪家
大数据·运维·人工智能·python
好家伙VCC16 分钟前
**发散创新:基于Rust的轻量级权限管理库设计与开源许可证实践**在现代分布式系统中,**权限控制(RBAC
java·开发语言·python·rust·开源
回家路上绕了弯25 分钟前
Git worktree 终极指南:告别分支切换烦恼,实现多分支并行开发
git·后端
m0_7190841126 分钟前
天机学堂aaaa
java
@atweiwei30 分钟前
用 Rust 构建agent的 LLM 应用的高性能框架
开发语言·后端·rust·langchain·eclipse·llm·agent
skilllite作者32 分钟前
Spec + Task 作为「开发协议层」:Rust 大模型辅助的标准化、harness 化与可回滚
开发语言·人工智能·后端·安全·架构·rust·rust沙箱
懒得起名_yyf32 分钟前
Http---详细格式介绍
后端
Dxy123931021632 分钟前
Python序列标注模型上下文纠错详解
开发语言·python
ZhengEnCi33 分钟前
P2H-Python字符串格式化完全指南-format和f-string的Python编程利器
python