狮山牡丹 發表於 2026-1-13 11:10:46

Spring获取Cookie和Session(@CookieValue()和@SessionAttribute())

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>获取 Cookie</li><ul class="second_class_ul"><li>传统获取 Cookie</li><li>简洁获取 Cookie(注解)</li></ul><li>获取 Session</li><ul class="second_class_ul"><li>Session 存储和获取</li><li>简洁获取 Session (1)</li><li>简洁获取 Session (2)</li></ul></ul></div><p class="maodian"></p><h2>获取 Cookie</h2>
<p class="maodian"></p><h3>传统获取 Cookie</h3>
<p>这是没有 Spring 的时候,用 Servlet 来获取(获取所有的 Cookie)</p>
<ul><li>Spring MVC 是基于 Servlet API 构建的原始 Web 框架,也是在 Servlet 的基础上实现的</li></ul>
<div class="jb51code"><pre class="brush:java;">@RequestMapping("/getcookie")
public String getCookie(HttpServletRequest request,
                                                HttpServletResponse response) {
    //String name = request.getParameter("name");
    Cookie cookies[] = request.getCookies();
    if (cookies != null) {
      //将 Cookie 转成了数据流,然后进行循环
      Arrays.stream(cookies).forEach(ck -&gt; System.out.println
      (ck.getName() + ":" + ck.getValue()));
    }
    return "获取Cookie成功";
}
</pre></div>
<ul><li>HttpServletRequest 代表 HTTP 的请求,HTTP 请求里面有什么,这个对象里面就有什么</li><li>HttpServletResponse 代表 HTTP 的响应,HTTP 响应里面有什么,这个对象里面就有什么<br />这两个对象属于 Spring 的内置对象,需要就加上,不用就不用写</li></ul>
<p>Cookie 是一个数组,所以进行循环打印</p>
<p>进入网页后,Cookie 可以直接进行修改(F12)。然后在里面添加信息,name=bite,value=666,随后保存</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011311102967.png" /></p>
<p>之后刷新,可在服务端看到 Cookie 信息</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011311102987.png" /></p>
<ul><li>Spring MVC 是基于 Servlet API 构建的原始 Web 框架,也是在 Servlet 的基础上实现的</li><li>HttpServletRequest,HttpServletResponse 是 Servlet 提供的两个类,是 Spring MVC 方法的内置对象,需要时直接在方法中添加声明即可</li><li>HttpServletRequest 对象代表客户端的请求,当客户端通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息</li><li>HttpServletResponse 对象代表服务器的响应。HTTP 响应的信息都在这个对象中,比如向客户端发送的数据,响应头,状态码等。通过这个对象提供的方法,可以获得服务器响应的所以内容</li><li>Spring MVC 在这两个对象的基础上进行封装,给我们提供更加简单的使用方法</li></ul>
<p class="maodian"></p><h3>简洁获取 Cookie(注解)</h3>
<p>Spring MVC 在这两个对象的基础上进行封装,给我们提供更加简单的使用方法<br />上面获取的话,就是获取的所有的 Cookie,而如果想要获取某个 Cookie,就需要使用 @CookieValue</p>
<div class="jb51code"><pre class="brush:java;">@RequestMapping("/getcookie2")
public String getCookie2(@CookieValue("bite") String bite) {
    return "从Cookie中获取值, bite:"+bite;
}
</pre></div>
<p><code>@CookieValue</code> 里面的值,就是你要获取的 <code>Cookie</code></p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011311102989.png" /></p>
<p class="maodian"></p><h2>获取 Session</h2>
<p class="maodian"></p><h3>Session 存储和获取</h3>
<p>传统方式也是用 Servlet 进行实现的</p>
<div class="jb51code"><pre class="brush:java;">@RequestMapping("/getsession")
public String getsession(HttpServletRequest request) {
    //从 Cookie 中获取到了 SessionId,根据 Session 获取 Session对象
    HttpSession session = request.getSession();
    String name = (String) session.getAttribute("name");
    return "从session中获取name:"+name;
}
</pre></div>
<ul><li>第四行是从 <code>Cookie</code> 中获取到 <code>SessionId</code>,然后根据 <code>SessionId</code> 获取到 <code>Session</code> 对象</li><li>然后通过 <code>getAttribute</code> 来获取你要拿的值</li></ul>
<p>因为 <code>session</code> 是在服务器中进行存储的,所以就不能像前面 <code>Cookie</code> 一样可以直接&ldquo;伪造&rdquo;了。就需要学习如何设置 <code>session</code></p>
<div class="jb51code"><pre class="brush:java;">@RequestMapping("/setsession")
public String setSession(HttpServletRequest request){
    //从 Cookie 中获取到了SessionId,根据 SessionId 获取Session对象
    //如果没有获取到,就会创建一个Session对象
    HttpSession session = request.getSession();
    session.setAttribute("name","zhangsan");
    return "设置session成功";
}
</pre></div>
<ul><li>首先是在 <code>Cookie</code> 中获取 <code>SessionId</code>,然后根据 <code>SessionId</code> 获取 <code>Session</code> 对象。如果没有获取到,就会创建一个 <code>Session</code> 对象</li><li>创建好 <code>Session</code> 之后,就可以进行设置了<ul><li>使用 <code>setAttribute</code> 进行设置,前面是 <code>name</code>,后面是 <code>value</code></li></ul></li></ul>
<p>可以通过 <code>Fiddler</code> 进行观察</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011311102953.png" /></p>
<p>之后就可以通过 <code>SessionId</code> 获取到 <code>Session</code> 的值了</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011311102970.png" /></p>
<p>如果擅自将下面的 <code>SessionId</code> 改了,就获取不到 <code>Session</code> 了</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011311102988.png" /></p>
<p class="maodian"></p><h3>简洁获取 Session (1)</h3>
<p>封装一些冗余的过程</p>
<div class="jb51code"><pre class="brush:java;">@RequestMapping("/getsession2")
public String getsession2(HttpSession session){
    String name = (String) session.getAttribute("name");
    return "从session中获取name"+name;
}
</pre></div>
<ul><li>这里 <code>HttpSession</code> 就直接省略了自己 <code>getSession</code> 的过程,直接就给我们提供了一个 <code>Session</code>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011311102981.png" /></p></li></ul>
<p class="maodian"></p><h3>简洁获取 Session (2)</h3>
<p>更进一步,能直接给到我们想要的 name 的值吗</p>
<div class="jb51code"><pre class="brush:java;">@RequestMapping("/getsession3")
public String getsession3(@SessionAttribute("name") String name){
    //String name = (String) session.getAttribute("name");
    return "从session中获取name:"+name;
}
</pre></div>
<p>这里的 <code>@SessionAttribute</code> 里面的值就是想要获取的 <code>Session</code> 的值,省略掉了指定 <code>name</code> 的步骤</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026011311102948.png" /></p>
<p>到此这篇关于Spring获取Cookie和Session(@CookieValue()和@SessionAttribute())的文章就介绍到这了,更多相关Spring获取Cookie和Session内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>SpringBoot&nbsp;&nbsp;Cookie&nbsp;&&nbsp;Session&nbsp;用户登录及登录状态保持功能实现代码</li><li>一文掌握Spring&nbsp;Cookie和Session&nbsp;是什么及区别介绍</li><li>聊聊Springboot2.x的session和cookie有效期</li><li>Springboot中登录后关于cookie和session拦截问题的案例分析</li><li>解决前后端分离 vue+springboot 跨域 session+cookie失效问题</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Spring获取Cookie和Session(@CookieValue()和@SessionAttribute())