会话技术
1、会话:一次会话包含多次请求和响应
2、作用:在一次会话的多次请求间,共享数据
3、方式:
(1)客户端会话技术:Cookie
(2)服务器端会话技术:Session
Cookie
1.概念: 客户端会话技术,将数据保存到客户端(Cookie这个对象是存在客户端的,服务器端可以获取)
2.解释一下这是干嘛的。
在一次会话期间(浏览器向服务器第一次发出请求起,到任意一方断开连接为止是一次会话,包含了
多次的请求响应)
第零,浏览器向服务器端发起请求;
首先,服务器创建一个会话对象Cookie响应给浏览器;
然后,浏览器保存这个Cookie;
最后,浏览器向服务器发送请求时会携带这个对象。(之后的请求头信息都会携带这个cookie数据)
这说明了什么? 不同的请求响应本来是独立的,但是现在不同的请求响应之间共享了数据!!
但是我有个问题,这样的cookie对象是全局的吗?(看下边的细节4,默认当前虚拟目录下都可以获取到)
3.步骤:
(1)服务器的一个servlet页面创建Cookie对象
Cookie cookie = new Cookie(“username”,“123456”);
(2)将cookie对象发送给浏览器
response.addCookie(cookie);
(3)服务器请求获取cookie(可以是另一个servlet页面)
Cookie[] cookies = request.getCookies();
if(cookies != null) {
for (Cookie cookie : cookies) {
System.out.println(cookie.getValue());
}
}
4.细节
(1)一次可以发送多个cookie
(2)可以保存多长时间
1、默认情况下:cookie存在浏览器的内存中。当浏览器关闭时,cookie数据被销毁
2、持久化存储:
cookie.setMaxAge(int seconds);
seconds > 0 ,将cookie数据存储到硬盘中,持久化存储;seconds是cookie的硬盘存活时间(注意,浏览器不关的话,即使过了设置的时间也可以继续访问)
seconds = 0,删除cookie信息
seconds < 0, 默认值
(3)Tomcat 8 之后可以存储中文数据
(4)Tomcat的获取范围
1.一个Tomcat部署的多个项目间,可不可以共享cookie数据?
*默认情况下,是不可以的。
*可以设置cookie的获取范围
setPath(String path) 默认情况下,设置的是当前的虚拟目录
若想共享,可以设置path为"/"
2.多个Tomcat服务器之间cookie共享
setDomain(String path):设置一级域名相同
5.特点和作用
(1)特点:
*存储在客户端浏览器
*浏览器对单个cookie的大小有限制,对同一个域名下的总cookie数也有限制
(2)作用:
1.一般用于存储少量的不太敏感的数据
2.在不登录的情况下,完成服务器对客户端的身份识别
6.一个例子:
题目:
当浏览器第一次访问时,页面显示消息“欢迎您首次访问本站”;
再次访问时,页面显示消息“欢迎回来,您上次访问本站的时间是”+上次访问时间。
解答:
@WebServlet("/visitedServletDemo1")
public class ServletDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies();
PrintWriter writer = response.getWriter();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
Date date = new Date();
String time = format.format(date);
// writer.write("您本次访问本站的时间是"+time);
Cookie cookie = new Cookie("last_visited_time",time+"");
cookie.setMaxAge(3000);
if(cookies != null){
for (Cookie cookiee : cookies) {
String name = cookiee.getName();
String value = cookiee.getValue();
if(name.equals("last_visited_time")){
writer.write("欢迎回来,您上次访问本站的时间是:"+value);
}
}
}else{
writer.write("欢迎您首次访问本站");
}
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
Session
1.概念: 服务器端会话技术,存储服务器端的共享数据
2.方法:
(1)setAttribute()
(2)getAttribute()
(3)removeAttribute()
3.步骤:
(1)获取session对象:
HttpSession session = request.getSession();
(2)放置共享数据:
session.setAttribute(String name,Object o);
(3)获取session对象:
HttpSession session = request.getSession();
(4)读取共享数据
session.getAttribute(String name);
4.原理:
一次会话获取的是同一个session,所以可以共享数据。
*怎么保证一次会话中获取的都是同一个session对象呢?
其实session共享数据技术是建立在cookie之上的。
在一次会话中,浏览器发起请求
服务器第一次获取session之后。会判断请求头里有没有session信息。
如果没有,就会在内存里创建一个新的session对象。
然后会在响应头中 set-cookie,返回session的id号,浏览器记录这个session的id号。
之后浏览器的请求头中都会携带该session的id号。
当服务器又获取session时,会识别到请求头里有session信息。
就不会在创建session,而是直接使用这个session对象。然后进行获取数据操作啊什么的
确保了一次会话只有一个session
5.细节
(1)浏览器关闭,服务器不关闭。同一个浏览器,,服务器两次获取的session是同一个吗?
默认情况下,不是。
但是可以设置cookie的保存时间,让cookie持久化保存
Cookie cookie = new Cookie("JSESSIONID",session.getId()); //把原来的set-cookie信息覆盖掉了
cookie.setMaxAge(300);
response.addCookie(cookie);
(2)客户端不关闭,服务器关掉,服务器两次获取的session是同一个吗?
不是同一个,但是要保证数据不会丢失。所以Tomcat会自动进行session的钝化和活化(idea活化不成功)
session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
session的活化:在服务器正常启动之后,将session文件转化为内存中的session对象
(3)session销毁时间(3种方法)
*服务器关闭
*session调用invalidate()方法
*默认失效时间 30min
6.特点
(1)存储一次会话多次请求之间的共享数据
(2)可以存储任意类型,任意大小的数据
Cookie和Session的区别
1.session存储在服务器端,cookie存储在浏览器
2.session没有大小限制,没有类型限制。cookie只能存储字符串
3.session 比 cookie 安全