Cookie,Session学习(java servlet编程)

Cookie

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

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

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

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

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

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

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

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

Cookie的获取

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

Session

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

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

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

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

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

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

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

  这时候有两种情况:

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

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang