JAVA WEB之 Session对象与Cookie简介

Cookie

  • Cookie是客户端的的对象(Cookie是由 服务端生成,再发送给客户端保存)。
  • Cookie其实就是本地缓存,记录了一些客户的信息。比如说客户在百度搜索栏中第一次搜索"Cookie"关键字,那么服务端会将这个信息写入Cooike中再发送给客户端,客户端保存至本地中,下次用户直接点击搜索栏,“Cookie”就会自动出现。
  • 再举一个例子,在使用Python爬取某些需要登录的网页时,可以借助Cookie来伪装自己登录了该网站。具体步骤如下:使用浏览器登录该网站,再查看登录之后的Cookie值,复制Cookie列表,使用python的requests库来添加Cookie,再爬取该网页就可以绕过登录。
  • 另外,即便用户没有设置Cookie,Cookie中也会有一个key,就是JSESSIONID,用于记录Session对象。 (原理就是:客户端第一次像服务端发出请求,产生了session对象(用于保存该客户信息),session对象就有sessionID这个变量,然后服务器再将这个变量存入cookie中,并改名为JSESSIONID。)
  • 作用:提高访问服务端的效率,但安全性较差。
  • 常用方法
Cookie: key=value
javax.servlet.http.Cookie
public Cookie (String key,String value)
String getName();
String getValue();
void setMaxAge(int expiry);   //最大有效期

response.addCookie(cookie);//服务端将Cookie发送给客户端,然后直接页面跳转即可(转发,重定向)
Cookie[] cookie request.getCookies();   //客户端获取Cookie。获取一个cookie列表,包含所有的cookie     

会话对象session

客户端与服务器端的一次会话(request–response) ,它用于存储或读取客户相关信息,与request相比作用范围更大。我们使用过的这个会话session 它是由HttpSession类创建的,而不是Session类创建的。
会话举例

  1. 浏览网站: 开始-关闭
  2. 购物: 浏览、付款、退出
  3. 电子邮件: 浏览、查看邮件、退出

session与Cookie的机制

  1. 客户端第一次请求服务端时,服务端会产生一个Session对象(用于保存该客户的信息,比如说用户名、密码、访问记录等),并且每个Session对象都会有一个唯一的sessionId(用于区分其他session,这里假设id是 123);然后服务端会将session存入cookies中,"key:JSESSIONID; value: 123"。
  2. 以登录为例子,当客户端之后再次请求服务端时,服务端会先用客户端的cookies中的JESSIONID去服务端的session中(数据库中查找)匹配sessionId,如果匹配成功则说明此用户不是第一次访问,于是可以无需登录了。(疑问:如果获取了别人的sessionId,能不能做一些邪恶的事情呢?????)

session与Cookies的比较

Cookie和session都是用于存储客户信息的,而cookie存储在客户端(硬盘中),session存储在服务端。两者的安全性级别也不同。

 public void setAttribute(String name, Object value);   //存储Object
 public Object getAttribute(String name);     //返回Object

另外,HttpSession所存储的是一个对象(Object),而cookies所存储的是字符串。

sessioncookie
保存的位置服务端服务端
安全性较安全较不安全
保存的内容ObjectString

session简单使用

数据创建

public void setAttribute(String key, Object obj)//将参数obj指定的对象保存到session对象中,key为指定的关键字(变量名)。

session.setAttribute(“username” ,“张三”);

数据获取

public Object getAttribute(String key)//获取session中关键字是key的对象。

session.getAttribute(“username” );

移除绑定的数据

session.removeAttriubte (“username” );

获取session对象所有关键

public Enumeration getAttributeNames( )//产生一个枚举对象,获取session中的各个对象所对应的关键字。

session的例题

在这里插入图片描述

  • 如果是重定向的跳转页面,那么当浏览器没有设置成自动保存cookie值时,session生命周期只存在于一个页面。跳转页面之后旧的session对象会被删除,新页面会新建一个session,导致session.getAttribute()获取的值全是Null。因为之前我的eclipse里面内置浏览器默认就是不保存cookie值得,所以我起初测试的时候一直出错,Session获得的值一直是null。
  • 后来在Chrome上测试成功,Chrome默认是保存cookie的,将Chrome设置成不保存cookie,则测试结果与eclipse内置浏览器结果完全一样,会新建session。
  • 原理如下:session在页面之间传递是依赖于cookie的,cookie中保存有sid,用户访问某个页面时cookie中的信息会一并被提交给服务器,服务器根据cookie中的sid获取对应的session,如果cookie没有保存的话,那么重定向会创建一个新的session。
  • 如果是转发跳转页面,则不需要考虑这么多。转发不会删除request与response。
    request.getRequestDispatcher("other.jsp").forward(request, response); //转发
  • 总结
    1. 转发:仍然共享session,request,response
    2. 重定向:不能共享reqeust,response,session取决于cookies。

session的生命周期

  • 在使用session的时候需要判断session是否过期,因为session有生存期限,一般是20-30分钟,因此如果使用过期的session对象则会出现意料之外的错误
  • 判断方法
    • 用户是否关闭浏览器
    • session对象是否调用invalidate()方法
    • session对象是否达到设置的最长发呆时间 (????)

一、判断生存周期的几个方法

 //设置有效期
public boolean isNew()  //session是否为新创建的
 //获取两个请求最大时间间隔
public int getCreationTime()  //获取session创建时间

二、会话超时管理

  • 返回客户端最后一次与会话有关的请求时间
getLastAccessedTime()
  • 以秒为单位返回一个会话内两个请求最大时间间隔
public int getMaxInactiveInterval()
  • 以秒为单位设置session的有效期
public void setMaxInactiveInterval(int max Value)
  • 销毁session
    • 虽然当客户端长时间不向服务器发送请求后,session对象会自尽,但对于某些实时统计在线人数的网站(例如,聊天室),每次都等session过期后,才能统计出准确的人数,这是远远不够的(???),所以还需要主动杀掉session。
session.invalidate()

session方法全家桶

public void setAttribute(String Key,Object obj):session对象类似于散列表,可以调用该方法将参数Object指定的
对象obj添加到session对象中,并为其添加的对象指定了一个索引关键字。如果添加的两个对象的关键字相同,
则先前添加的对象被清。
 public Object getAttribute(String Key):获取session对象中含有的关键字是Key的对象,由于任何对象都可以添加
到session对象中,所以在该方法取回对象时应进行强制类型转换。
 public Enumeration getAttributeName():session对象调用该方法产生一个枚举对象.该枚举对象使用nextElement()
方法遍历Session对象所含有的全部对象。
 public long getCreationTime(): Session对象调用该方法要以获取对象创建的时间,单位是毫秒,从197071
日午夜起至该对象创建时刻所走过的毫秒数。
 public long getLastAccessedTime():获取当前session对象最后一次被操作的时间。
 public int getMaxInactiveInterval():得到允许session对象处于非活动状态的最长时间。
 public vodi setMaxInactiveInterval(int n):设置允许session对象处于非活动状态的最长时间。(单位是秒)。
 public void removeAttribute(String Key):从当前session对象中删除关键字是key的对象。
 public String getId():获取session对象的编号。
 invalidate():使Session对象无效。
 long getCreationTime():返回session对象的创建时间
 public String getId():返回session创建时JSP引擎为它设置的唯一ID号。
 long getLastAccessedTime():返回此session中客户端最近一次的请求时间。
 int getMaxInactiveInterval():返回两次请求间隔多长时间此session被取消(ms)。
 5String[] getValueNames():返回一个包含此session中所有可用属性的数组。
 boolean isNew():返回服务器创建的一个session,客户端是否已经加入。
 void setMaxInactiveInterval():设置两次请求间隔多长时间此session被取消(ms)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值