学习笔记十(Cookie和Session)

背景:

HTTP无状态纯文本协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出。这样的设计严重阻碍的Web程序的设计。如:在我们进行网购时,买了一条裤子,又买了一个手机。由于http协议是无状态的,如果不通过其他手段,服务器是不能知道用户到底买了什么。而Cookie就是解决方案之一。

Cookie

简介

Cookie实际上就是服务器保存在浏览器上的一段信息,主要用于区分不同的用户。

Cookie运行原理
  • 请求
  • 服务器创建一个Cookie对象,该Cookie对象携带用户信息,服务器发送(响应)给客户端
  • 以后客户端再发送请求时,会携带该Cookie对象。
  • 服务器会根据该Cookie对象(及信息),区分不同用户。
Cookie的使用:

1、创建

  • Cookie cookie = new Cookie(String name,String value);
  • response.addCookie(cookie);

2、获取

  • Cookie[] cookies = request.getCookies();
  • cookie.getName()|getValue()

3、修改

  • 覆盖式修改
    • Cookie cookie = new Cookie(“同名”,“新值”);
    • response.addCookie(cookie);
  • 直接修改
    • Cookie[] cookies = request.getCookies();
    • 找到指定的Cookie
    • cookie.setValue(“新值”);

4、Cookie的键值问题

  • name不可以为中文,value可以为中文,需要指定字符集问题,所有建议使用英文。

5、Cookie有效性

  • 默认为会话级别,与浏览器有关(关闭浏览器或换一个浏览器失效)
  • 持久化
    • setMaxAge(ss:秒);
      • ss>0:在ss秒后失效
      • ss=0:立即失效
      • ss<0:默认会话级别

注意:持久化Cookie,该Cookie就不是会话级别,以具体的持久化操作为准。

6、Cookie有效路径(Cookie的路径指告诉浏览器访问那些地址时该携带该Cookie)

  • 默认有效路径:当前项目路径
  • setPath():一般设置有效路径,都是基于当前项目下的路径进行设置。
    • 如:cookie.setPath(request.getContextPath()+"/a");
    • 设置为 /项目名/路径 cookie.setPath(“/项目名/路径”)
      • 这样设置只有访问“/项目名/路径”下的的资源才会携带Cookie

7、Cookie应用
* 记住密码等

8、Cookie缺陷

  • Cookie的value为String型,不灵活。
  • Cookie存放在浏览器中,不安全。
  • Cookie过多,会浪费流量,增加了客户端与服务端的数据传输量。

Session

简介

使用Cookie有一个非常大的局限,就是如果Cookie很多,则无形的增加了客户端与服务端的数据传输量。而且由于浏览器对Cookie数量的限制,注定我们不能再Cookie中保存过多的信息,于是Session出现。
Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie,这个JESSIONID对应这个服务器中的一个Session对象,通过它就可以获取到保存用户信息的Session

类型: HttpSession

Session工作原理
  • 请求
  • 服务器创建Session,同时创建一个特殊的Cookie,该Cookie的key为固定值:JSESSIONID,value为session的id。
  • 服务器将该Cookie对象发送(响应)给客户端
  • 以后客户端再请求时,会携带该Cookie对象。
  • 服务器会根据Cookie的value,找到相应的Session,从而区分不同的给用户。
Session获取
  • html(Servlet):request.getSession()
  • jsp:直接获取(session是jsp中的隐含对象)
Session有效性
  • 默认有效性:当前会话(因为特殊的Cookie是会话级别)
  • Session存活时间
    • 默认存活时间为30分。
  • 持久化Session
    • 持久化特殊Cookie

    • 设置session的非活动时间
      1、 web.xml中

       * 	<session-config>
       	 	<session-timeout>30分钟</session-timeout>
       	 </session-config>
      

      2、 session.setMaxInactiveInterval(ss秒);

      • ss>0:在ss秒后失效
      • ss<=0:永不失效(Tomcat>=7)
      • session立即失效
        • session.invalidate();
Session钝化与活化
  • 钝化:将session对象及session对象中的数据,一同从内存中序列化到硬盘的过程称之为钝化。
    • 时机:服务器关闭时触发
  • 活化:将session对象及session对象中的数据,一同从硬盘反序列化到内存的过程称之为活化。
    • 时机:服务器重启时触发
表单重复提交问题

1、 转发,F5
2、提交后,网速慢,连续点击提交按钮
3、提交后,点击回退按钮,继续提交
表单提交流程:

  • 提交-Servlet-响应

解决思路:
在Servlet中干预提交,第一次提交,以后不提交

  1. 使用UUID,作为Token。将Token存放到session域和隐藏域中。( UUID:是一个全球唯一的32为的16进制的随机数。)
  2. 提交,判断变量是否为初始值
    true:提交,移除session域中的Token(UUID)。
    false:不提交
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值