1.SpringSession简介

1.0.Web项目中的作用域

在Java的Web项目中,提供了3个容器用来存储数据, 方便在各层调用时传递信息.

这些容器包含:

HttpServletRequest   request;    // 一次请求, 遇到 response 或者 生成页面(页面代码)
HttpSession session;             // 一次会话
ServletContext application;      // 上下文

这些容器通过 相应的方法操作数据:

.setAttribute("key", value);  // 存入数据.getAttribute("key");         // 取出数据.removeAttribute("key");   // 从容器中取出数据

由于这些容器所影响的范围各不相同, 所以也叫作用域;

其中session 是跨越同一用户的多次请求来记录数据, 所以常用来记录用户各自的信息.

1.1.HttpSession

HTTP是无状态协议,当一次请求Rquest遇到响应Response后,保存的信息就会消失。第二次请求, 就是一新的请求, 不会保持任何与第一次请求相关的内容。

HttpSession( 简称 session ) 在 Cookie的配合下就能解决这个问题。

当客户端浏览器第一次访问服务器时,服务器会为客户端创建一个session对象, 这个session对象有唯一的sessionId作为标识, 在响应时把sessionId通过Cookie响应给客户端。在服务器session对象可以保存用户信息等信息, 然后把session对象放到session池中,注意,只有在第一次访问时,服务器才会创建session,给客户端响应sessionId。从此以后就不会了!

当客户端再次访问服务器时,会在请求头信息中带着sessionId给服务器,服务器通过sessionId到session池中找到session对象,进而得到在session中保存的信息, 这就可以完成会话跟踪了。也就是说,服务器端保存的是session对象,而客户端只有sessionId。每次访问都需要通过客户端的sessionId来匹配服务器端的session对象!这样用户在session中保存的数据就可以再次被使用了。

在 Controller 加入下面的方法

    @RequestMapping("/testSession")public String testSession(HttpSession session, ModelMap modelMap){System.out.println("session.getId() = " + session.getId());modelMap.put("sessionid", session.getId());return "test";}@RequestMapping("/testCookie")public String testCookie(HttpSession session, ModelMap modelMap){System.out.println("session.getId() = " + session.getId());modelMap.put("sessionid", session.getId());return "test";}

添加 页面 test.html, 在页面中加入

<span th:text="${sessionid}"></span> :
<a th:href="@{/testCookie}">testCookie</a>

打开开发者工具, 再查看cookie中的信息

再 打开 网络 , 点击 testCookie 超链接

查看 请求头信息

1.2.session 与 cookie

什么是Cookie?

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端会把Cookie保存起来。Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。

session 与 cookie 两者的区别:在安全和性能方面考虑

1、cookie数据存放在客户端,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上,当访问增多,会比较占用你服务器的性能,考虑性能应当使用cookie。

4、不同浏览器对cookie的数据大小限制不同,个数限制也不相同。单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、可以考虑将登陆信息等重要信息存放为session,不重要的信息可以放在cookie中。

两者的联系:

1、都是用来记录用户的信息,以便让服务器分辨不同的用户。

2、可以搭配使用,但都有自己的使用局限,要考虑到安全和性能的问题。

1.2.1.自定义 cookie 存储信息

在 controller 的方法中增加 :

// 将接收到的用户登录信息再保存到cookie中, 返回给浏览器Cookie cookieUsername = null;
Cookie cookiePassword = null;
Cookie cookieRememberMe = null;
System.out.println("rememberMe:" + rememberMe);
if("true".equals(rememberMe)) {cookieUsername = new Cookie("username", tchUser);cookiePassword = new Cookie("password", tchPass);cookieRememberMe = new Cookie("rememberMe", rememberMe);// 定义保存时长 单位: 秒cookieUsername.setMaxAge(60*60*24*30);cookiePassword.setMaxAge(60*60*24*30);cookieRememberMe.setMaxAge(60*60*24*30);response.addCookie(cookieUsername);response.addCookie(cookiePassword);response.addCookie(cookieRememberMe);
}else {cookieUsername = new Cookie("username", tchUser);cookiePassword = new Cookie("password", tchPass);cookieRememberMe = new Cookie("rememberMe", rememberMe);cookieUsername.setMaxAge(0);cookiePassword.setMaxAge(0);cookieRememberMe.setMaxAge(0);response.addCookie(cookieUsername);response.addCookie(cookiePassword);response.addCookie(cookieRememberMe);
}

在登录页面中html部分 , 通过表单提交将Controller传递信息

<form name="info"  th:action="@{/login}" method="post" ><div class="form-group has-feedback"><input type="text" name="tchUser"    id="user"    class="form-control"  required placeholder="账号"><span class="glyphicon glyphicon-user form-control-feedback"></span></div><div class="form-group has-feedback"><input type="password" name="tchPass"  id="pass"   class="form-control" required placeholder="密码" ><span class="glyphicon glyphicon-lock form-control-feedback"></span></div><div class="row"><div class="col-xs-8"><div class="checkbox icheck"><label><input type="checkbox" name="rememberMe" value="true"> 记住账号</label></div></div><div class="col-xs-4"><button type="submit" class="btn btn-primary btn-block btn-flat">登 录</button></div></div>
</form>

在 登录页面的javascript脚本中 , 从cookie中取出数据

   $(function(){// console.log(document.cookie);//username=admin; password=111211var name = getCookie('username');var pass = getCookie('password');var rememberMe = getCookie('rememberMe');if("true" == rememberMe){$("#user").val(name);$("#pass").val(pass);// $("#rm").prop("checked", "checked");$('input').iCheck('check')}else{$("#user").val("");$("#pass").val("");//  $("#rm").prop("checked", false);}});//根据key得到cookie中的值function getCookie(c_name) {if(document.cookie.length > 0) {c_start = document.cookie.indexOf(c_name + "=");//获取字符串的起点if(c_start != -1) {c_start = c_start + c_name.length + 1;//获取值的起点c_end = document.cookie.indexOf(";", c_start);//获取结尾处if(c_end == -1) c_end = document.cookie.length;//如果是最后一个,结尾就是cookie字符串的结尾return decodeURI(document.cookie.substring(c_start, c_end));//截取字符串返回}}return "";}

SpringSession ( 一 ) HttpSession相关推荐

  1. 5.1linux整理

    虚拟机下linux的安装与使用 1 虚拟机下linux的安装与使用 1.1 安装虚拟机 1.2 启动虚拟机的linux系统 1.3 Xshell与虚拟机链接 1.3.1 为什么要用Xshell工具 1 ...

  2. 从Spring-Session源码看Session机制的实现细节

    作者:徐靖峰 原文:https://www.cnkirito.moe/2018/04/17/spring-session-4/ 去年本文作者曾经写过几篇和 Spring Session 相关的文章,从 ...

  3. spring-session用redis实现session共享实践

    什么是spring session? Spring Session provides an API and implementations for managing a user's session ...

  4. spring-session用mysql实现session共享实践

    前段时间,写了篇<spring-session-data-redis解决session共享的问题>文章,介绍了spring-session使用redis存储实现session共享的内部机制 ...

  5. redisson集成spring-session和shiro实现分布式session

    一.pom <!-- Shiro权限验证 --><dependency><groupId>org.apache.shiro</groupId><a ...

  6. 从spring-session存储结构探讨session存储方案的演变

    我们知道Spring Session 主要解决了分布式场景下 Session 的共享问题,本文将从 Spring Session 的源码出发,来讨论一些 Session 设计的细节. 一.Spring ...

  7. 【spring-session】介绍

    前言 spring-session 2.0.10.RELEASE 项目地址: https://spring.io/projects/spring-session 文档地址: https://docs. ...

  8. spring+redis自主实现分布式session(非spring-session方式)

    为什么80%的码农都做不了架构师?>>>    背景:最近对一个老项目进行改造,使其支持多机部署,其中最关键的一点就是实现多机session共享.项目有多老呢,jdk版本是1.6,s ...

  9. 玩转SpringSession,重要知识点全面剖析(续篇)

    作者:怀瑾握瑜 www.cnblogs.com/lxyit/p/9672097.html 上一篇文章中介绍了Spring-Session的核心原理,Filter,Session,Repository等 ...

最新文章

  1. 预见未来丨机器学习:未来十年研究热点
  2. PHP之preg_replace()与ereg_replace()正则匹配比较讲解
  3. 最大熵模型:读书笔记
  4. 一统江湖的大前端(7)React.js-从开发者到工程师
  5. spring使用@Value标签读取*.properties文件的中文乱码问题的解决
  6. 推荐几个代码自动生成器,神器
  7. DBMS_SQLTUNE + SQL Performance Analyzer 实战小记
  8. Alexa 开发指南
  9. linux控制风扇转速的命令,Linux下笔记本的风扇控制问题
  10. java毕业设计成品SpringBoot+VUE实现的电影院会员积分管理系统
  11. Shel编程之条件语句 条件 if ,case语句
  12. 2星|《反焦虑思维》:冥想、遛狗、散步、打哈欠等可以缓解焦虑
  13. 腹直肌整体(01):器械卷腹
  14. pycharm 中 pydev debugger: CRITICAL WARNING: This version of python seems to be incorrectly compiled
  15. 关于ios苹果企业开发者
  16. OLED显示与LCD显示的区别
  17. 什么是BGP,一般机房的BGP是什么意思?
  18. Oracle与SQL *PLUS简介
  19. 古诗文网站之网络爬虫
  20. 【Linux】面试题(2021最新版)

热门文章

  1. Microsoft Office 2007 换号方法:
  2. 苏州太仓| 第六届“创赢太仓”全球创业大赛博士后专场项目征集公告
  3. user-cf的理解-初衷
  4. 基于JAVA花卉网站计算机毕业设计源码+数据库+lw文档+系统+部署
  5. 【Windows】局域网内远程桌面控制
  6. 整日碎片化学习“凡不凡”?来看看优秀的Android开发都是如何学习的,破解碎片化学习的骗局!
  7. 索尼手机c6802的Android,索尼C6802 (Xperia UL)ROOT教程,简单几步完成ROOT
  8. php爬虫爬取百度的内容,爬虫(一)抓取百度页面的内容
  9. 视频版:从零开始搭建WordPress个人网站
  10. C语言课程设计 全国交通咨询模拟,全国交通咨询模拟系统C++实现(课程设计报告).doc...