Cookie_Session简介
Cookie和session要解决的问题
cookie_session是用来解决会话问题的.什么是会话呢?在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程,例如,一个用户在某网站上的整个购物过程就是一个会话。
其实这里的会话就是我说的多次请求响应这个过程.但是多次请求响应何时开始何时结束呢?
会话中遇到什么问题了呢?就是我说的希望在多次请求响应之间将一些数据保存在合适的区域.而我们现在对WEB的访问是,发出一次请求,服务端对本次请求响应之后,能够保存数据的那三个区域都无法满足我们的需求.而我们现实生活中浏览某些网站时,这些网站需要记录住我们用户的一些信息的,此时可以利用cookie_session来解决
Cookie
1_Cookie简介(参照PPT)
*_采用cookie之后协议底层的传输方式
GET /test/Servlet01 http/1.1
请求头
请求头
请求头
空行
http/1.1 200 ok
响应头
响应头
Set-Cookie:
"k1=v1; Expires=Mon, 19-Jun-2017 01:35:43 GMT; Path=/day37
k2=v2; Expires=Mon, 19-Jun-2017 01:35:43 GMT; Path=/day37"
响应头
空行
响应体
POST /test/Servlet01 http/1.1
请求头
请求头
请求头
Cookie:"k1=v1,k2=v2"
空行
请求体
Cookie API
API介绍
*_创建Cookie
Cookie ck1=new Cookie(“k1”,”v1”);
ck1.setMaxAge(606024*7);
ck1.setPath(“/day38”);
*_发送cookie
response.addCookie(ck1);
*_获取所有cookie
Cookie[] cks=request.getCookies();
for(Cookie ck:cks){
ck.getName();
ck.getValue();
}
//获取浏览器发送的指定cookie
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie coo : cookies) {
if("username".equals(coo.getName())){
//打印cookie的名称和值
System.out.println(coo.getName()+":"+coo.getValue());
}}}
*_删除cookie
获取到待删除的cookie
ck.setMaxAge(0);
ck.setPath(“/test”);
response.addCookie(ck);
不同的浏览器对Cookie个数有限制,对于单个Cookie的大小也是有限制
Cookie中如何存入中文信息
String value= URLEncoder.encode("张三","utf-8");
Cookie ck=new Cookie("name",value);
response.addCookie(ck);
response.getWriter().print("send cookie ok");
Cookie ck=CookieUtil.findCookieByName(request.getCookies(),"name");
if(null!=ck){
String value=ck.getValue();
String myName=URLDecoder.decode(value, "utf-8");
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("cookie的值是:"+myName);
}
记录用户上次访问时间
public class VisitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
/**
* 1.获得从客户端带过来的所有的Cookie:
* 2.从所有的Cookie中查找指定名称的Cookie:
* 3.判断是否是第一次访问:
* * 是第一次:显示欢迎
* * 不是第一次:显示欢迎 同时显示上次访问时间.
* 4.记录当前的时间,并且利用Cookie将时间回写到浏览器端.
*/
// 获得客户端的所有的Cookie:
Cookie[] cookies = request.getCookies();
// 从cookies的数组中查找指定名称的Cookie:
Cookie cookie = CookieUtils.findCookie(cookies, "visitTime");
// 判断是否是第一次访问:
response.setContentType("text/html;charset=UTF-8");
if(cookie == null){
// 第一次访问
response.getWriter().println("<h1>欢迎来到本网站!</h1>");
}else{
// 不是第一次
long time = Long.parseLong(cookie.getValue());
Date date = new Date(time);
response.getWriter().println("<h1>欢迎来到本网站!您的上次访问时间是:"+date.toLocaleString()+"</h1>");
}
// 记录当前的时间,回写到Cookie中.
Cookie c = new Cookie("visitTime",""+System.currentTimeMillis());
response.addCookie(c);
}
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
doGet(request, response);
}
}
Cookie其它知识
1_Cookie的分类
_会话级别的Cookie:默认的.关闭了浏览器Cookie就销毁了.
_持久级别的Cookie:需要设置有效时长的.关闭浏览器也不会销毁的Cookie.
setMaxAge(int expiry); 以秒为单位的时间,超过了该时间后Cookie会自动销毁. setMaxAge(0),手动删除持久性的Cookie。(前提:path和name必须一致)
setPath(String uri); 设置Cookie的有效路径.
Session:
API介绍
创建
request.getSession();
向session放入数据
sess.setAttribute(name,obj)
sess.getAttribute(name)
sess.getAttributeNames()
sess.removeAttribute(name);
销毁session
sess.invalidate();//销毁session
其他API(了解)
sess.getLastAccessTime(); //获取上次访问时间
sess.getCreateTime();//创建时间
sess.getId();//获取jessionid对应的字符串
域对象简介
作用域:变量/对象在程序中有效范围
前提: WEB项目特殊性(相对JAVASE),
1_项目启动不会关闭
2_运行在2个位置,服务端/客户端
3_基于请求响应模型
我们再访问WEB项目过程中,多次请求响应中,在程序中产生数据,希望把这些数据保存下来.
保存在不同的作用范围内.
希望数据最大范围有效? 放置在ServletContext中
希望数据本次请求响应有效? 放置在request中
希望数据本次会话有效? 放置在session中
域对象: servletContext/session/request
Session应用:
1_登录成功之后,用户信息放在session中
2_验证码放在session中
3_购物车
场景: 各个不同的客户端访问服务端,访问的是各自不同的数据,这些数据经常访问
其它知识点
Cookie/session区别
存储的位置不同:cookie客户端浏览器,session服务端的内存
存储的数据的大小不同:cookie限制,session服务端内存大小限制
安全性:cookie不安全,session安全
Cookie运行过程分析:
当客户端和服务端的多次请求响应过程中,需要将部分数据以Cookie的形式保,存在客户端,执行过程如下
简介:
服务端有ServletDemo01,ServletDemo02,当从浏览器向服务端的ServletDemo01发起请求
在ServletDemo01中创建2个Cookie对象,分别设置cookie对象的有效期,路径,之后发送cookie.
当浏览器识别到Set-Cookie响应头后,会在客户端保存2个Cookie对象,
不同的浏览器保存的位置和方式不同,IE保存在cookies文件夹下,火狐浏览器保存在自带的数据库软件中SQLLite中
这2个Cookie对象分别有个自己的键值对,有效期和路径.
当浏览器向ServletDemo01或者ServletDemo02发起请求时,由于ServletDemo02和
ServletDemo01都拥有共同的路径test,也就是都在项目test下,那么本次请求会将刚才
保存的cookie对象携带在HTTP的请求部分发送到服务端,在ServletDemo02中可以获取到这2个cookie对象
Cookie解惑
1_Cookie为什么有路径?
客户端的浏览器下是有很多来自不同网站的Cookie对象的,如果我们
没有路径,可能会将来自百度的Cookie发送给Google,这样Google就获取
到了来自百度的Cookie这是不允许的.
总之当我们向某个WEB项目发起请求时,仅仅是将和这个项目
相关的Cookie对象发送到了相关的WEB项目.
2_当Cookie过了有效期,将不再向服务端发送,浏览器会自行处理
3_cookie中不会以明文的形式存储重要的数据
Cookie的应用
1_保存用户的用户名
2_记录用户的行为,例如,京东商场左下角有一个最近访问的产品记录信
息,当当网上有你最近浏览过的书籍信息,都是根据用户访问页面,记
录到cookie的信息来制作的。
3_电商购物车的处理,因为在不同页面,点击添加到购物车,这个信息也
是记到了cookie里面。结账的时候统一提交
4_定制页面。如果网站提供了换肤的功能,我们这个时候也是将他记录到
cookie里面,以便下次访问还是保持原来的风格页面。
Session运行过程分析:
当mary的浏览器向服务端的ServletDemo01发起的请求需要保存一些数据时,而且数据保存在服务端时,可以调用request.getSession()在服务端创建一个session对象.底层的实现过程为Tomcat在内存中生成一个叫做sessionid的随机的字符串,通过这个sessionid,在服务端为mary的本次会话关联一个session对
象,session对象中有各种属性,其中还封装了一个空map对象(用于存放程序运行过程也能够中产生的数据)
当tomcat对本次请求进行响应时将内存中生成的sessionid在响应头以cookie的形式发送到浏览器端,此后当浏览器再次向服务端的Sevlet01发起请求时,会将sessionid再次发送到服务端,tomcat通过sessionid,就可以找到在服务端为mary开辟的服务端的session对象
当jack的浏览器向服务端的ServletDemo01发起请求需要为jack的会话保存数据时,tomcat也为jack的会话创建sessionid,和sessionid对应的在服务端也会有一个session对象和jack的会话关联,以后再jack和浏览器的
多次请求响应中,都维护了sessionid,通过这个sessionid就可以找到服务端为jack建立的session对象,就可以向session中存放键值对的数据
此后只要jack和mary的浏览器没有关闭的前提下,对服务端的其他动态资源访问时,就可以将各自维护的sessioinid发送到服务端,那么tomcat就可以通过这个
sessionid获取到为jack和mary建立的session对象,就可以向其中存储和获取各自独立的数据.
*_获取session的方法是:request.getSession();
执行过程为
tomcat看本次请求的请求头是否通过请求头携带过一个sessionid
1_如果没有,新建一个随机的字符串,并创建一个和这个随机字符串关联的session对象.
2_如果有,通过这个随机的字符串看内存中是否已经存在一个和其相等的字符串
2.1_存在,说明之前创建过session对象,那么获取到这个session对象返回即可.
2.2_不存在,说明之前的session已经销毁或者是用户在伪造session
则在服务端没有一个和这个字符串的值相等的字符串,此时新建一个
随机的字符串, 并创建一个和这个随机字符串关联的session对象.
Session的本质
服务端为各个不同的客户端创建了一个对象,这个对象在服务端,用来保存来自各个客户端的数据
Sssion的生命周期
创建:当用户访问服务端时,首次碰到request.getSession()
【当用户访问服务端时,访问servlet或者jsp页面时会自动创建Session】
销毁:1_服务器非正常关闭
2_session超时(默认30分钟,可以配置)
3_session销毁
注意:
服务器正常关闭,session对象不在内存中,被序列化到硬盘上, 此时重新启动服务器,
还是可以将session加载到内存中的
何为一次会话?
客户端和服务端交互过程中,session有效期期间的请求响应为一次会话.
浏览器关闭:
sessionid是以cookie的形式来实现的,而且对应的cookie是会话级别的,有效期为0.
浏览器关闭,随机的字符串将无法向服务端传递.
Servlet中提到的3个域对象是什么?如何理解
易混淆的API
读取配置文件的:
.getInitparameter(“”) .getInitparameterNames()
读取表单参数
req.getParameter(name); req.getParameterValues(name);
req.getParameterMap();
读取HTTP协议请求头
req.getHeader(name); req.getHeaderNames();
控制域对象
*.setAttribute(“name”,”value”);
*.removeAttribute(“name”);
*.getAttributeNames();