Java Web 内幕学习系列 十、深入理解Session与Cookie

Java Web 内幕学习系列 十、深入理解Session与Cookie
一、理解Cookie
Cookie的作用简单来讲就是用户访问服务器之后,服务器会将一些key/value键值对返回给客户浏览器,并给这些数据加上一些限制条件,在条件符合时,用户下次访问的时候,会将这些数据返回给服务器。
因为HTTP是无状态的协议,服务器无法区分用户的访问是不是和上次访问是同一个用户,Cookie的作用就是帮助服务器区分访问的用户。
1.1 Cookie的属性项
Cookie常用属性项
属性项     介绍
NAME-VALUE  键值对,用于存储数据
Expires     过期时间,具体时间
Domain     当前cookie的有效域名
Path     当前cookie的生效路径
Max-Age     最大失效时间,多少秒后失效
Port      当前cookie的生效端口,多个以逗号隔开
Secure     如果设置这个属性,那么只会在SSH连接时才会回传该cookie
NAME-VALUE不能使用中文,否则会出现乱码,可以编码之后使用。
使用Cookie 根据不同的浏览器版本,会有不同的Cookie数量以及总大小限制。
当服务器添加多个Cookie时,每个Cookie都会在响应头中返回给浏览器。
1.2 Cookie 常见使用代码
    
    
  1. public Cookie getCookie(Cookie[] cookies, String cookieName){
  2. if(cookies != null){
  3. for (Cookie cookie : cookies){
  4. if(cookie.getName().equals(cookieName)){
  5. return cookie;
  6. }
  7. }
  8. }
  9. return null;
  10. }
  11. public void doGet(HttpServletRequest request, HttpServletResponse response){
  12. Cookie[] cookies = request.getCookies();
  13. Cookie userName = getCookie(cookies, "userName");
  14. if(userName == null){
  15. Cookie cookie = new Cookie("userName","ceshi");
  16. //可以设置cookie 的相关属性,例如设置有效期,设置有效域名或者路径
  17. response.addCookie(cookie);
  18. }
  19. }

二、理解Session
    Cookie可以解决我们区分访问客户的功能,但是每次浏览器都要传递这些Cookie,如果Cookie很多的时候,就增加了浏览器与服务器之前的传递数据量,Session正好解决了这个问题。
    同一个客户端与服务端交互时,不再传递所有Cookie ,只要传递一个ID,这个ID是客户端第一次访问服务端时生成,而且时唯一的。这个ID的NAME为JESSIONID的Coolkie。
2.1 Session 与Cookie
    Cookie保存在浏览器,Session保存在服务端
    Cookie相对容易被攻击,Session相对安全
    Session需要基于一个NAME为JESSIONID的Cookie工作。
    如果浏览器不支持Cookie,浏览器会采用URL重写的方式,将NAME为JESSIONID的Cookie加到url中。
注意这个JESSIONID名称不是不可以修改的,可以在webl,xml中添加session-config的配置项,其配置项下面的name属性,就是对应的JESSIONID,可以自定义,一般不建议更改。
2.2 Session 的用法
代码示例
    
    
  1. public void doGet1(HttpServletRequest request, HttpServletResponse response){
  2. HttpSession session = request.getSession();
  3. Object userName = (String)session.getAttribute("userName");
  4. if (userName == null){
  5. session.setAttribute("userName","ceshi");
  6. }
  7. }
Session 生命周期是默认时间30分钟,过期失效,服务器关闭时,会将Session持久化到本地磁盘。
三、解决Session和Cookie存在的问题
3.1 多终端共享Session
    多终端贡献Session的关键在于服务端必须使用统一的会话架构,统一存储Session。
    
 

3.2 多应用单点登录SSO
    单点登录也即多个应用使用同一套登录系统,关键在于多应用共享Session。有两种情况,一是多个应用都在统一的顶级域名下面,可以按照多终端共享Session的方式设计,实现相对简单。另外一种情况是多个应用都是独立的顶级域名,这个时候,我们除了要解决共享Session以外,还要解决Cookie跨域名的问题。
    
 
 
        上面流程介绍了用户访问A应用时的登录过程,同样当用户去访问B应用时,会有同样的判断过程,只不过这个时候从登录系统判断的用户是已经登陆的状态,无需再次登录。
3.3 表单重复提交
    防止表单重复提交需要标识用户的每一次访问,使得用户每一次访问都是唯一确定的。实现方式如下,用户访问表单页面时,会在服务器生成一个token,传递到表单页面隐藏域,用户提交表单时会校验token是否和服务端的token一致,如果一致,清除服务端token 。这样即便用户出现重复提交,由于token只能校验一次,所以也只能一次的表单提交是有效的。
    
 
    
3.4 多终端登录 扫码登录
    
 
手机端必须是已登录状态,扫描的PC端登录页带有特定标识,手机扫码成功后,会去服务器设置该标识,表示已经登录成功,PC端不断的通过心跳检测的方式去判断该标识是否已经设置,如果已经设置,则表示登录成功,以上操作即可实现手机扫码登录。
3.5 防止Session和Cookie伪造
    Cookie会存储用户的一些私密信息,这时如果出现Cookie泄漏,可能会造成用户信息泄漏的危险,因此,在使用Cookie时,我们应尽量避免使用Cookie存储用户的私密信息,如果必须要存储,需要对相关信息进行加密,同时也可以设置Cookie的httpOnly属性,可以防止Cookie被客户端JS等查看。
    对于Seesion的安全,我们可以在用户登录的时候,生成一个唯一的Session签名,作为用户唯一的合法登录状态,用户每次访问服务器时,我们都要校验这个签名和服务器重新生成的签名是否一致,如果不一致,让用户重新登录。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值