Cookie,Session学习(java servlet编程)

Stella981
• 阅读 658

Cookie

问题:HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁。如果第二次的请求需要使用相同的请求数据怎么办呢?难道是让用户再次请求书写吗?

为了解决这个问题,引入了Cookie技术;

Cookie技术其实就是浏览器端实现的数据临时存储技术,保存一些必要的数据,当访问某些网页需要这些数据时,浏览器自动将数据加到HTTP请求中;

但是具体要保存哪些数据,还有访问哪些网页加上Cookie,还有Cookie信息保存多久都是由服务器决定的。

浏览器的Cookie数据保存位置:

Cookie,Session学习(java servlet编程)

下面就介绍在java servlet编程中如何使用Cookie技术

如果不懂Servlet编程的要先了解servlet,先看另一篇文章:https://www.cnblogs.com/zdl2234/p/11280080.html

  创建Cookie对象
       Cookie c=new Cookie(String name, String value);//Cookie是作为键值对的形式保存的
  设置cookie(可选)
    设置有效期
      c.setMaxAge(int seconds);//如果不设置有效期,那么数据只会保存到浏览器内存中,浏览器关闭就会失效
    设置有效路径
      c.setPath(String uri);  //如果不设置有效路径,则访问任何网页都会附带这个Cookie数据
    响应Cookie信息给客户端
            resp.addCookie(c);

Cookie的获取

  获取Cookie信息数组
    Cookie[] cks=req.getCookies();
  /遍历数组获取Cookie信息
    使用for循环遍历即可,示例:
      if(cks!=null){
        for(Cookie c:cks){
          String name=c.getName();
          String value=c.getValue();
          System.out.println(name+":"+value);
        }
      }

Session

  学习 Cookie 之后,解决了不用用户编写请求数据的共享问题。但具体的数据还是由客户端发送过来的,其实某个Servlet需要的数据很可能是别的Servlet已经获取过的,我们可以通过别的Servelt获取需要的数据,就不用每次都要客户端发送了,减少了数据的量,可以提高数据的传输效率。

那么现在要解决的就是Servlet之间的数据共享问题,那么Session就出现了;

  原理:用户使用浏览器第一次向服务器发送请求,服务器在接受到请求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建 一个 session 对象,用来存储用户请求处理相关的公共数据,并将 此 session 对象的 JSESSIONID 以 Cookie 的形式存储在浏览器中 (临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请 求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后, 调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其 对应的 session 对象。

  与Cookie不同的是,Session的数据是保存在服务器上的,不同的Servlet通过同一个JSESSIONID就可以获取同一个Session;

如何使用Session?( 一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。)

//创建session对象/获取session对象
  HttpSession hs=req.getSession();
  //如果请求中拥有session的标识符也就是JSESSIONID,则返回其对应的session队形
  //如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为从cookie数据存储到浏览器内存中
   //如果session对象是失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中。
//设置session存储时间
   hs.setMaxInactiveInterval(int seconds);
//注意:
  //在指定的时间内session对象没有被使用则销毁,如果使用了则重新计时。
  //设置session强制失效
   hs.invalidate();
//存储和获取数据
//存储:  hs.setAttribute(String name,Object value);
//获取:  hs.getAttribute(String name) 返回的数据类型为Object
//注意:
//存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行。

Session失效处理:
  因为Session都有一个存储时间,当访问别的需要用到Session的网页,通过HttpSession hs=req.getSession()获取Session,再通过Session获取之前存的信息;

  这时候有两种情况:

  1,可以获取之前的信息,这表示Session没有失效,则继续处理;

  2,获取信息为null,这表示Session为新创建的,之前的Session失效了,一般这时候就要重定向到可以获取信息的页面了;

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Django中的session的使用
一、Session的概念cookie是在浏览器端保存键值对数据,而session是在服务器端保存键值对数据session的使用依赖cookie:在使用Session后,会在Cookie中存储一个sessionid的数据,每次请求时浏览器都会将这个数据发给服务器,服务器在接收到sess
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django组件——cookie与session
Django组件——cookie与session<fontcolor00bff一、会话跟踪技术</font<fontcolorff7f501、什么是会话跟踪技术</font先了解一下什么是会话。可以把
Stella981 Stella981
2年前
Django_cookie和session
cookie和session1.cookie:在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当该用户发送第二次请求的时候,就会自动的把上次
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这