- 会话:打开一个站点开始 到你关闭这个站点的整个过程 叫做一次会话
- 为什么要学习会话技术?因为http协议是无状态 要通过会话技术保持用户的状态和信息
- 两种会话技术:Cookie Session
- Cookie技术是把数据存储到客户端 下次在访问网站的时候 将这个数据一起携带过去,数据都存放在客户端 相对不安全 服务端压力相对小一些
- Session技术是把数据存储在服务器端 ,数据相对安全一点 但是服务压力大
二、Cookie技术
- 常用API
- 新建一个Cookie:
Cookie cookie = new Cookie(name,value)
- 回写客户端:
response.addCookie(cookie);
- 获取cookie:
Cookie[] cookies = request.getCookies();
cookie.getName();//获取cookie里name的值
cookie.getValue();//获取cookie的值
- 持久化时间:
cookie.setMaxAge(second);
- cookie的携带路径:
cookie.setPath("/wen应用名/具体页面);
- 访问哪个域名携带(设置第三方cookie)
cookie:cookie.setDomian(.baidu.com);
//()内些具体的域名,以.开始
- cookie的创建和获取的案例
// 设置一个访问时间的timercookie
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
SimpleDateFormat simp = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date d = new Date();
String timer = simp.format(d);
Cookie cookie = new Cookie("timer", timer);
response.addCookie(cookie);
// 取出cookie的数据
Cookie[] c = request.getCookies();
//判断是否是第一次访问
boolean flag = true;
if (c != null)
{
for (Cookie cookie1 : c)
{
//判断cooke的name值是否与需要的一样
if ("timer".equals(cookie1.getName()))
{
//获取cookie的对应的值
String value = cookie1.getValue();
//向页面写出数据
writer.write("你上次访问的时间是" + value);
flag = false;
}
}
}
//判断是否是第一次访问页面
if (flag)
{
writer.write("欢迎访问本网站");
}
- 新建一个Cookie:
- cookieAPI细节:
- 会话级别的cookie和持久级别的cookie?会话级别的cookie存储在浏览器的缓存中 浏览器一关闭 缓存清除 cookie一起清除掉了持久级别的cookie 持久化到浏览器在磁盘的目录 不同的浏览器目录不一样cook.setMaxAge(秒); //网页缓存相关头 expires注意:setMaxAge的参数时间 设置0 代表删除相应的cookie
- cookie的携带路径?cookie.setPath()如果没有显示设置cookie的携带路径的话 默认访问这个web应用的所有的资源都携带cookie,前提是访问过具有创建设置cookie对象能力的页面之后。如果将cookie的path设置成“/”那么在访问服务器中的所有web应用都会携带ccokie(访问webApps下的所有应用都会携带cookie),同样也需要访问过具有创建设置cookie对象能力的页面之后。如果设置了cookie.setPath()具体值之后,在访问带有创建设置cookie页面之后,再去访问其他页面,不会带有cookie值,之后再次访问该页才会有。注意:如果某一个cookie设置了path 要想删除这个cookie 除了设置setMaxAge(0) 还需需要把path路径设置成一样设置cookie
Cookie cookie = new Cookie("name","xiaohua");
cookie.setPath("/");
response.addCookie(cookie);
Cookie [] cookies=request.getCookies();
if(cookies!=null)
{
for(Cookie c:cookies)
{
if("name".equals(c.getName()))
{
c.setMaxAge(0);
//如果这个的这个setpath没有写就不会删除成功
c.setPath("/");
response.addCookie(c);
}
}
}
注意:创建cookie和删除cookie可以不再一个页面,但是如果设置了setpath或者Domian那么删除的时候也需要进行设置,其原因是因为cookie在请求头中只携带name和value,并不携带其他信息,所以删除的时候要进行信息的补齐。 - 设置第三方cookie?cookie.setDomain(); //设置cookie在访问哪个域名时携带cookie什么是第一方cookie和第三方cookie?第一方cookie: 访问百度 cookie.setDomain(".baidu.com");第三方cookie: 访问百度 cookie.setDomain(".jd.com");
三、Session 技术
- HttpSession对象是Servlet的三大域对象之一,其他两个域对象是HttpServletRequest和ServletContext。这三个域中,request的域范围最小,它的域范围是整个请求链,并且只在请求转发和包含时存在;session域对象的域范围是一次会话,而在一次会话中会产生多次请求,因此session的域范围要比request大;application的域范围是最大的,因为一个web应用只有唯一的一个application对象,只有当web应用被移出服务器或服务器关闭它才死亡,它的域范围是整个应用。
- 常用API
- 获取Session对象:
Session session=request.getSession();
- 向域中添加域属性;
session.setAttribute(String name,Object value)
- 从域中获取指定名称的属性值;
session.setAttribute(String name,Object value)
- 移出域中指定名称的域属性
session.removeAttribute(String name):
- 获取Session对象:
- request.getSession();的内部实现是怎样的? 当调用getSession方法时 会首先去服务器的内存中找一下是否有这个用户的session 如果有直接返回 如果没有,创建session对象在返回。session其实是借助cookie session的编号JSESSIONID注意:客户端阻止写cookie session就不能用 JSSESSIONID
- session的生命周期:
- 何时创建:第一次掉request.getSession();
- 何时销毁:(1)服务器关闭。(2)手动调用销毁session的方法 session.invalidate();(3)session在30分钟不使用就自动销毁(Tomcat的web.xml中) 问题:浏览器关闭后响应session销毁? 错,session对象和本地客户端没有关系
- 修改session默认的销毁时间在自己web应用中web.xml,不要修改tomcat的全局的xml
- Url重写()由于sessio对象能够知道是谁在访问,是通过获得用户本地cookie的JSSESSIONID,它代表了session的编号。如何客户端阻止写cookie session,就不能使用JSSESSIONID。解决方法:response.encodeURL(url);
HttpSession session = request.getSession();
PrintWriter writer = response.getWriter();
String path = "/android_web09/showBookList";
path = response.encodeURL(path);
writer.write("<a href=\""+path+"\">访问图书商城首页</a>");