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类创建的。
会话举例:
- 浏览网站: 开始-关闭
- 购物: 浏览、付款、退出
- 电子邮件: 浏览、查看邮件、退出
session与Cookie的机制
- 客户端第一次请求服务端时,服务端会产生一个Session对象(用于保存该客户的信息,比如说用户名、密码、访问记录等),并且每个Session对象都会有一个唯一的sessionId(用于区分其他session,这里假设id是 123);然后服务端会将session存入cookies中,"
key:JSESSIONID; value: 123
"。 - 以登录为例子,当客户端之后再次请求服务端时,服务端会先用客户端的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所存储的是字符串。
session | cookie | |
---|---|---|
保存的位置 | 服务端 | 服务端 |
安全性 | 较安全 | 较不安全 |
保存的内容 | Object | String |
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); //转发
总结
:- 转发:仍然共享session,request,response
- 重定向:不能共享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对象会自尽,但对于某些实时统计在线人数的网站(例如,聊天室),每次都等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对象调用该方法要以获取对象创建的时间,单位是毫秒,从1970年7月1
日午夜起至该对象创建时刻所走过的毫秒数。
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)。