在根据HTTP超文本传输协议中的Cookie机制下引入Session,进一步了解客户端与服务器的对话请求和信息交互以及页面信息的保持连接机制。相关的Cookie知识已经在“浅谈Cookie”中介绍,本次只记录学习中的Session内容。
首先,什么时候要用到session呢?当我们在浏览网站时候的信息开始和关闭中其实就建立了session机制。异或是我们在购物时候输入了个人信息,浏览相关的页面并且留下了信息,再到退出时刻,一致在进行着session连接。
##session机制:
客户端第一次请求服务端时,(jsessionid-sessionid)服务端会产生一个session对象(用于保存该客户的信息);
并且每个session对象 都会有一个唯一的 sessionId( 用于区分其他session);
服务端由会 产生一个cookie,并且 该cookie的name=JSESSIONID ,value=服务端sessionId的值;
然后 服务端会在 响应客户端的同时 将该cookie发送给客户端,至此 客户端就有了 一个cookie(JSESSIONID);
因此,客户端的cookie就可以和服务端的session一一对应(JSESSIONID - sessionID)
客户端第二/n次请求服务端时:服务端会先用客户端cookie种的JSESSIONID 去服务端的session中匹配sessionid,如果匹配成功(cookie jsessionid和sesion sessionid),说明此用户 不是第一次访问,无需登录。
就好比说:我们运动场上的运动员在进场时候,裁判会判断他们是否是运动员并且如果是的话就分给相应的比赛号码,当一段时间后运动员可能出去了但是比赛号码仍在身上,再一次进场的时候,只要号码匹配正确,就证明了是运动员,允许进入并且可以使用之前比赛获得的成绩。当这一届比赛结束后,号码被收回,运动员也失去了相应的成绩信息,然后可能在下一届比赛的时候再进行一次新的号码分发,并且可能上次成绩没有保留下来。
##深入理解函数和用法
###针对Cookie
1.response :响应对象
提供的方法:
void addCookie( Cookie cookie ); 服务端向客户端增加cookie对象
void sendRedirect(String location ) throws IOException; 页面跳转的一种方式(重定向)
void setContetType(String type):设置服务端响应的编码(设置服务端的contentType类型)
2.session(服务端)
Cookie(客户端,不是内置对象):Cookie是由 服务端生成的 ,再发送给客户端保存。
相当于本地缓存的作用: 客户端(hello.mp4,zs/abc)->服务端(hello.mp4;zs/abc)
作用:提高访问服务端的效率,但是安全性较差。
服务端准备Cookie:
response.addCookie(Cookie cookie)页面跳转(转发,重定向)
客户端获取cookie: request.getCookies();
a.服务端增加cookie :response对象;客户端获取对象:request对象
b.不能直接获取某一个单独对象,只能一次性将 全部的cookie拿到
通过F12可以发现除了自己设置的Cookie对象外,还有一个name为 JSESSIONID的cookie
建议 cookie只保存 英文数字,否则需要进行编码、解码
###针对Session
session:
a. session存储在服务端
b. session是在 同一个用户(客户)请求时 共享
c. 实现机制:第一次客户请求时 产生一个sessionid 并复制给 cookie的jsessionid 然后发给客户端。最终 通过session的sessionid-cookie的jsessionid
session方法:
String getId() :获取sessionId
boolean isNew() :判断是否是 新用户(第一次访问)
void invalidate():使session失效 (退出登录、注销)
void setAttribute()
Object getAttribute();
void setMaxInactiveInterval(秒) :设置最大有效 非活动时间
int getMaxInactiveInterval():获取最大有效 非活动时间
客户端在第一次请求服务端时,如果服务端发现 此请求没有 JSESSIONID,则会创建一个 name=JSESIONID的cookie 并返回给客户端
Cookie:
a.不是内对对象,要使用必须new
b.但是,服务端会 自动生成一个(服务端自动new一个cookie) name=JSESIONID的cookie 并返回给客户端
###cookie和session的区别:
|-------- |session |cookie
|保存的位置 |服务端 |客户端
|安全性 |较安全 |较不安全
|保存的内容 |Object |String
##JSP9大内置对象
pageContext JSP页面容器
request 请求对象
session 会话对象
appliation 全局对象
response 响应对象
config 配置对象(服务器配置信息)
out 输出对象
page 当前JSP页面对象(相当于java中的this)
exception 异常对象
四种范围对象(小->大)
pageContext JSP页面容器(page对象) 当前页面有效
request 请求对象 同一次请求有效
session 会话对象 同一次会话有效
appliation 全局对象 全局有效(整个项目有效)
以上4个对象共有的方法:
Object getAttribute(String name):根据属性名,或者属性值
void setAttribute(String name,Object obj) :设置属性值(新增,修改)
setAttribute("a","b") ;//如果a对象之前不存在,则新建一个a对象 ;如果a之前已经存在,则将a的值改为b
void removeAttribute(String name):根据属性名,删除对象
a.pageContext 当前页面有效 (页面跳转后无效)
b.request 同一次请求有效;其他请求无效 (请求转发后有效;重定向后无效)
c.session 同一次会话有效 (无论怎么跳转,都有效;关闭/切换浏览器后无效 ; 从 登陆->退出 之间 全部有效)
d.application 全局变量;整个项目运行期间 都有效 (切换浏览器 仍然有效);关闭服务、其他项目 无效