一、会话技术简介
1.什么是会话,为什么需要会话技术?
会话:从打开一个浏览器,访问某个网站,到关闭这个浏览器的这个过程称为一次会话。http协议是状态的。
2.会话技术的分类
客户端存储技术:Cookie
服务端存储技术:Session
Cookie和Session的区别?
1)存储在Cookie中的用户的信息 存在客户端,Session将数据存储在服务器端,但是需要在客户端存储Session的编码id
2)安全性而言 Cookie相对不安全 Session相对安全
3)性能而言:根据实际的情况
二、会话技术之Cookie
Cookie技术是将数据存储到客户端
1.怎样去向客户端写出一个cookie
1)创建Cookie对象
Cookie cookie = new Cookie(name,value);
2)向客户端写出cookie
response.addCookie(cookie );
客户端:客户端解析http响应,响应头中有一个cookie,客户端会自动将cookie的信息存储到客户端的缓存中
2.怎样从客户端获取一个Cookie
1)获得客户端携带的所有的cookie
Cookies[] request.getCookies();
2)获得具体的某个cookie
遍历所有的cookie
通过getName()获得某一个cookie的名字
通过getValue()获得某一个cookie的值
3.设置Cookie时的细节
1)会话级别的cookie和持久级别的cookie
会话级别的cookie:会话结束cookie就清空
持久级别的cookie:会cookie存储到磁盘上
保存在磁盘上的时间
cookie.setMaxAge(秒);
注意:如果要想删除磁盘已经存储的cookie
将同名的cookie的持久化时间设置为0
将要删除的cookie的路径设置成与磁盘上存储的cookie的路径一致(即两个cookie的setPath一致)
2)设置cookie的携带的路径
cookie在默认情况下 会在产生的cookie资源的所在的目录下都携带
cookie.setPath(携带cookie的路径);
设置cookie的携带路径时以/开头,/代表本web服务器
例如:
cookie.setPath(“/”), cookie在访问web服务器下的所有资源的都携带
cookie.setPath(“/home”),在home应用时携带cookie
3)设置三方cookie(了解)
cookie.setDomain(域名);
三方cookie具有进攻性
4.以上代码实现
1 response.setContentType("text/html;charset=UTF-8"); 2 //1、创建时间的Cookie 3 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 4 String accessTime = format.format(new Date()); 5 Cookie cookie = new Cookie("accessTime",accessTime); 6 //1.1 设置cookie的持久化的时间----在磁盘上存储的时间 7 //cookie.setMaxAge(60*10); 8 //1.2 设置cookie的携带路径 /代表web服务器 9 cookie.setPath("/day11_208/abc/accessTime"); 10 //2、将cookie写给客户端 11 response.addCookie(cookie); 12 //3、获取客户端携带的时间的cookie 13 String accessTime_client = null; 14 Cookie[] cookies = request.getCookies(); 15 if(cookies!=null){ 16 for(Cookie coo:cookies){ 17 //取出美哟个cookie对象的名字 18 String cookieName = coo.getName(); 19 if("accessTime".equals(cookieName)){ 20 //取出该cookie的值 21 accessTime_client = cookie.getValue(); 22 } 23 } 24 } 25 26 //4、为用户显示上次访问时间 27 if(accessTime_client!=null){ 28 response.getWriter().write("您的上一次访问时间是:"+accessTime_client); 29 }else{ 30 //第一次访问 31 response.getWriter().write("您是第一次访问"); 32 }
三、会话技术之Session
1.怎样去创建session/获得session
HttpSession session = request.getSession();
上述方法的内部原理:
当request在调用getSession方法时,内部会去查看一下该用户是否在web应用的内部存在一块内存区域,如果有直接返回这个内存区域的地址,如果没有就创建一个新的session区域
服务器端通过什么判断用户是否已经存在session的呢?
根据session的编号id--->JSESSIONID
2.session的生命周期
创建:第一次调用request.getSession()
销毁:
1)服务器关闭 session销毁
2)session超时 默认30分钟
计算点从何时开始:最后一次操作该站点后的30分钟
3)手动销毁session
session.invalidate();
3.Session是一个域对象
Session是借助于Cookie的,同一个Session的标志就是JSESSIONID相同。
如果将浏览器关闭,在打开访问资源,会重新创建session
怎样将session持久化----->存储JSESSIONID的Cookie持久化
抓包工具获得:
Set-Cookie: JSESSIONID=6232D4782FC69B1D780261E93DFA5FBB; Path=/day11_208/;
手动创建一个Cookie 在上面的cookie的基础上 多一个max-age
1 //手动创建Cookie存储JSESSIONID 2 //Set-Cookie: JSESSIONID=6232D4782FC69B1D780261E93DFA5FBB; Path=/home/; 3 Cookie cookie = new Cookie("JSESSIONID",session.getId()); 4 cookie.setPath("/home/"); 5 cookie.setMaxAge(60*10); 6 7 response.addCookie(cookie);
如果客户端禁用Cookie,客户端不能在存储Cookie,JSESSIONID丢失,解决?
解决方案:URL重写,在每个url地址后都使用分号;拼接JSESSIONID
1 HttpSession session = request.getSession(); 2 System.out.println(session.getId()); 3 String url = "/home/index.jsp"; 4 url = response.encodeRedirectURL(url); 5 System.out.println(url); 6 response.sendRedirect(url);
http://localhost/home/index.jsp;jsessionid=377B2F0501FF9FE643D7D88F4E883FFD