会话
一、会话的概念
1.1 一次会话
打开浏览器 -> 访问一些服务器内容 -> 关闭浏览器
1.2 会话管理
管理浏览器和服务器之间的会话过程中产生的会话数据
1.3 如何管理会话数据
会话过程中要解决的一些问题?
用户使用浏览器与服务器交互,肯定会产生用户需要的一些数据,服务器
要想办法为每一个用户保存这些数据。
例如:多个用户点击超链接通过一个servlet各自购买了一个商品,服务器
应该想办法把每一个用户购买的商品保存在各自的地方,以便于这些用户点
结帐servlet时,结帐servlet可以得到用户各自购买的商品为用户结帐。
提问:这些数据保存在Request或ServletContext中行不行?
域对象:实现资源之间的数据共享。
request域对象
context域对象
登录场景:
1)使用context域对象保存会话数据:
小张:输入“张三”(保存数据,context.setAttribute("name","张三"))-》用户主页显示“张三”
李四:输入“李四”(保存数据,context.setAttribute("name","李四"))-》用户主页显示“李四”
如果使用context保存会话数据,则会出现数据覆盖问题。
2)使用request域对象保存会话数据:
使用request域对象保存会话数据,一定要使用转发来保存数据,如果重定向,则数据丢失。
如果使用request域对象保存会话数据,整个网站都会用转发,不合理。
综上,使用域对象保存会话数据,不可行。
1.4 会话技术
Cookie技术:把会话数据保存在浏览器客户端。
Session技术:把会话数据保存在服务器端。
会话技术的核心:
1.浏览器会自动保存Set-Cookie响应头中的数据。
2.浏览器每次访问服务器都会带着保存会话数据的Cookie的请求头。
Session技术的核心:
服务器创建Session对象存储会话数据,把对象的唯一标识以
Cookie的形式写给浏览器。 浏览器带着唯一标识再次访问
服务器,取出会话数据。
Cookie
Cookie是客户端技术,服务器把每个用户的数据以cookie的形式
写给浏览器,浏览器把会话数据保存下来,然后每次访问服务器时
都会带着这些会话数据。
Cookie技术: 会话数据保存在浏览器客户端。
Cookie核心的API:
2.1 在服务器端创建Cookie对象
Cookeie cookie = new Cookie("name","value");
2.2 把cookie发送给浏览器端(通过响应头:set-cookie)
response.addCookie(cookie);
2.3 浏览器带着cookie信息访问服务器(通过请求头:cookie),服务器得到cookie信息
Cookie[] cookies = request.getCookies();
局限:
1)只能保存字符串类型,不能保存中文
2)一个cookie不能超过4kb
Session
Sesison是服务器端技术,服务器可以为每一个浏览器创建一个独享的Session对象。
由于Session为用户浏览器独享,所以用户在访问web资源时,可以把各自的数据放在独享的Session中。
Session技术:会话数据保存在服务器端。(内存)
Session核心的API:
3.1 创建或得到session对象
HttpSession session = request.getSession(); //创建或得到session对象
request.getSession(false); //得到session对象
3.2 会话数据保存session对象中,和得到会话数据
session.setAttribute("name",Object); 保存数据
session.getAttribute("name") 得到数据
注意:
1)session.setIntactiveInterval(时间); 设置session过期时间
2)session.invalidate() 手动销毁session对象
二、Cookie技术
2.1 特点
Cookie技术:服务器把会话数据保存在客户端
2.2 Cookie的创建过程
Cookie类:用于存储会话数据
1)构造Cookie对象
Cookie ck=new Cookie("key","value");
2)设置cookie
void setPath(String uri) :设置cookie的有效访问路径
void setMaxAge(int expiry) : 设置cookie的有效时间
void setValue(String newValue) :设置cookie的值
3)发送cookie到浏览器端保存
方式一:
response.addCookie(Cookie cookie) : 发送cookie
方式二:
response.setHeader("Set-Cookie","name=hlp,id=12,age=14")
4)服务器接收cookie
方式一:
Cookie[] cks=request.getCookies() : 接收cookie
方式二:
String cookies=request.getHeader("Cookie");
服务器发送Cookie信息给浏览器:
方式一:
Cookie name=new Cookie("name","hlp");
Cookie id=new Cookie("id","12");
response.addCookie(name);
response.addCookie(id);
方式二:
response.addCookie("Set-Cookie","name=hlp,id=12")
服务器接收浏览器携带的Cookie信息:
方式一:
Cookie[] cookies=request.getCookie();
方式二:
String cookies=request.getHeader("Cookie");
2.3 Cookie的原理
代码实现
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//方式一:设置Set-Cookie响应头发送会话数据
//resp.setHeader("Set-Cookie","name=hlp");
//方式二:使用respone.addCookie()发送会话数据【推荐使用】
Cookie name_cookie=new Cookie("name","hlp");
resp.addCookie(name_cookie);
}
}
浏览器获取响应数据,会自动把Cookie信息保存下来。
然后浏览器每一次请求服务器,都会带着Cookie信息。
Cookie技术原理:
创建过程:
1) 服务器发送cookie信息到浏览器
Cookie cookie=new Cookie("name","value");
response.addCookie(cookie);
实质上是发送 【set-cookie: name=eric】响应头
2)浏览器得到服务器发送的cookie,然后保存在浏览器端。
3)浏览器在下次访问服务器时,会自动带着cookie信息
实质上是发送 【cookie: name=eric】的请求头
4)服务器接收到浏览器带来的cookie信息
request.getCookies();
总结:
response.addCookie(cookie)
这个方法用于在响应中添加一个Set-Cookie的响应头。
类似于:response.setHeader("Set-Cookie","name=hlp")
req.getCookies()
这个方法用于从请求中获取Cookie的请求头。
类似于:request.getHeader("Cookie")
服务器把会话数据设置到Set-Cookie的响应头中,
浏览器接收到响应后,就会自动把会话信息保存下来。
然后浏览器每次请求服务器,都会自动携带Cookie的请求头。
Cookie技术实质:浏览器和服务器通过一个响应头Set-Cookie和请求头Cookie来交换数据。
2.4 Cookie的细节
2.4.1 Cookie的有效路径
1)如果没有设置有效路径,Cookie的有效路径默认为 /项目名。
2)Cookie的有效路径的作用:
只要是访问该有效路径下的任何资源,浏览器就会携带该
Cookie,否则不携带。
举例:
public class Hello extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie=new Cookie("name", "hlp");
Cookie cookie2=new Cookie("name2", "hlp2");
//注意:对cookie修改时,比如设置有效时间、有效路径,
//代码一定要写在响应添加cookie之前,否则失效。
//cookie.setPath("test");
//cookie2.setPath("Demo3");
resp.addCookie(cookie);
resp.addCookie(cookie2);
System.out.println("...");
}
}
Cookie的有效路径默认为 /项目名。
案例1:
如果Cookie的有效路径默认为 /Demo ,服务器把该Cookie保存
在浏览器,浏览器就会根据路径来判断是否携带该Cookie。
当浏览器访问 http://localhost:8080/Demo/a.html
时就会携带该Cookie。
如果浏览器访问 http://localhost:8080/Test/a.html
时就不会携带该Cookie。
案例2:
设置Cookie的有效路径 /Demo/test ,服务器把该Cookie保存
在浏览器,浏览器就会根据路径来判断是否携带该Cookie。
当浏览器访问 http://localhost:8080/Demo/test /a.html
时就会携带该Cookie。
如果浏览器访问 http://localhost:8080/Demo/a.html
时就不会携带该Cookie。
2.4.2 Cookie的大小限制
Cookie数据类型只能保存非中文字符串类型的。可以保存多个
cookie,但是浏览器一般只允许存放300个Cookie,每个站点
最多存放20个Cookie, 每个Cookie的大小限制为4KB。
2.4.2 会话Cookie(默认)
设置Cookie的有效时间为负数,此时Cookie保存在浏览器的内存中。
只要浏览器已关闭,Cookie就会消失。我们称之为这个状态下的
cookie为会话cookie。即一次会话(浏览器开启-》访问-》关闭)中有效。
默认情况下,我们创建的Cookie就是会话Cookie,在一次会话中有效。
2.5 Cookie的API
Cookie类:用于存储会话数据
1)构造Cookie对象(创建)
Cookie(java.lang.String name, java.lang.String value)
2)设置cookie
void setPath(java.lang.String uri) :设置cookie的有效访问路径
void setMaxAge(int expiry) : 设置cookie的有效时间
void setValue(java.lang.String newValue) :设置cookie的值
3)发送cookie到浏览器端保存(发送)
void response.addCookie(Cookie cookie) : 发送cookie
4)服务器接收cookie(接收 )
Cookie[] request.getCookies() : 接收cookie
2.5.1 服务器发送Cookie信息给浏览器:
方式一:
Cookie name=new Cookie("name","hlp");
Cookie id=new Cookie("id","12");
response.addCookie(name);
response.addCookie(id);
方式二:
response.addCookie("Set-Cookie","name=hlp,id=12")
2.5.2 服务器接收浏览器携带的Cookie信息:
方式一:
Cookie[] cookies=request.getCookies();
方式二:
String cookies=request.getHeader("Cookie");
2.5.3 Cookie的基础设置
1)void setPath(java.lang.String uri) :设置cookie的有效
访问路径。有效路径指的是cookie的有效路径保存在哪里,那么浏览器
在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。
2)void setMaxAge(int expiry) : 设置cookie的有效时间。
正整数:表示cookie数据保存浏览器的缓存目录
(硬盘中),数值表示保存的时间。
负整数:表示cookie数据保存浏览器的内存中。
浏览器关闭cookie就丢失了!!
零:表示删除同名的cookie数据
设置Cookie的有效路径
cookie.setPath("/demo/test");
Cookie的有效路径默认为当前项目,其作用是只有当浏览器访问该路径下
的资源时,才会携带该Cookie,否则不会携带。
HttpServlet.java
public class Hello extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie=new Cookie("name", "hlp");
//浏览器访问 http://localhost:8080/demo/test/a.html 会携带该Cookie
//浏览器访问 http://localhost:8080/demo/a.html 不会携带该Cookie
cookie.setPath("/demo/test");
resp.addCookie(cookie);
}
}
设置Cookie的有效时间
cookie.setMaxAge(-1);
正整数:表示cookie保存在浏览器的缓存目录中(硬盘上)。
设置cookie保存的时间,单位为秒。
只要当Cookie的有效时间到了,Cookie才会消失,
否则,即使浏览器关闭,也不会消失。
负整数:表示cookie保存在浏览器的内存中。
浏览器只要一关闭,Cookie就会消失。
零:表示删除浏览器端的同名cookie。
删除cookie时,path必须一致,否则不会删除
设置有效时间
public class Hello extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie=new Cookie("name", "hlp");
//1.负整数
//表示会话级别Cookie,一次会话有效。(浏览器关闭就消失)
//cookie.setMaxAge(-1);
//2.零
//表示删除同名cookie,删除cookie时,path路径要设置一致
//cookie.setMaxAge(0);
// cookie.setPath("/day10/test")
//3.正整数:cookie保存在硬盘上20s,20s后消失。
cookie.setMaxAge(20);
resp.addCookie(cookie);
}
}
案例1-显示用户上一次访问时间
HeeloServlet.java
public class Hello extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
resp.setCharacterEncoding("utf-8");
Cookie n=new Cookie("time", new Date().toGMTString());
if(cookies==null) {
resp.getWriter().write("您是第一次访问,hlp");
}else {
Cookie c = cookies[0];
resp.getWriter().write("您上一次访问时间为:"+c.getValue());
}
resp.addCookie(n);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>org.hlp.demo.Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
a.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="./hello">
<input type="submit" value="提交"/>
</form>
</body>
</html>
展示效果:
三、Session技术
3.1 引入
Cookie的局限:
1)Cookie只能存字符串类型。不能保存对象
2)只能存非中文。
3)1个Cookie的容量不超过4KB。
如果要保存非字符串,超过4kb内容,只能使用session技术!!!
Session特点:
会话数据保存在服务器端。(内存中)
3.2 Session的创建过程
代码解读: HttpSession session=req.getSession
1)第一次访问会创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID
HttpSession session=req.getHttpSession();
2)把JSESSIONID作为Cookie的值发给浏览器进行保存。
实质上相当于把JESSIONID作为Set-Cookie的值发送给浏览器。类似于以下代码:
Cookie cookie = new Cookie("JSESSIONID", sessionID);
response.addCookie(cookie);
3)第二次访问的时候,浏览器会带着JSESSIONID的cookie访问服务器
4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。
if(找到){
return map.get(sessionID);
}
if(没找到){
return new Session();
}
5)如果找到对应编号的session对象,直接返回该对象
6)如果找不到对应编号的session对象,创建新的session对象,继续走1的流程
结论:通过JSESSIONID的cookie值在服务器找session对象!!!!!
HttpSession技术:
1)服务器调用req.getSession()原理分析:
a.服务器会先获取JESSIONID的值,然后通过JSESSIONID的值获取
对应的session对象。
b.如果服务器没有获取到session对象,就会创建session对象,然
后会将该session的JSESSIONID值以Cookie技术传给浏览器。
c.浏览器会把JESSIONID的值保存下来,然后每次访问服务器都会
带着JESSIONID的Cookie值。
3.3 Session的原理
代码实现
Hello1.java
public class Hello1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session
HttpSession session = req.getSession();
session.setAttribute("name", "hlp");
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>org.jsoft.demo.Hello1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
浏览器第一次访问该servlet。
服务器获取JSESSIONID,然后通过JESSIONID获取session对象,如果没有获取到,就会创建session对象,然后将sesison的JSESSIONID值以Cookie的形式写给浏览器。
浏览器再次访问servlet。
浏览器会带着JSESSIONID的Cookie值去访问,服务器通过JSESSIONID的值获取sesison对象,然后取出服务器端的session对象,获取资源数据。
Session技术原理:
req.getSession();
1)服务器创建session对象。
2)然后自动将唯一标识JSESSIONID作为Cookie的值写给浏览器,让浏览器保存下来。
相当于
Cookie c=new Cookie("JSESSIONID",ID);
response.addCookie(c);
3)浏览器每次访问服务器都会带着该Cookie值。
4)服务器接收到请求后,就会根据唯一标识JSESSIONID将对应的session对象取出来。
3.4 Session的细节
3.4.1 Session销毁的时间
Session默认的销毁时间是30分钟,但是由于JSESSIONID是由Cookie形式写在浏览器的,且使用
的是默认Cookie,即一次会话有效。所以Session默认的销毁时间是30分钟,但是JSESSIONID默
认的销毁时间是一次会话。
3.5 HttpSession的API
HttpSession类:用于保存会话数据
1)创建或得到session对象
HttpSession getSession()
HttpSession getSession(boolean create)
2)设置session对象
void setMaxInactiveInterval(int interval) : 设置session的有效时间,单位为秒
void invalidate() : 销毁session对象
java.lang.String getId() : 得到session编号
3)保存会话数据到session对象
void setAttribute(String name,Object value) : 保存数据
Object getAttribute(String name) : 获取数据
void removeAttribute(String name) : 清除数据
3.5.1 req.getSession() 与 req.getSession(boolean)
1)
req.getSession()
req.getSession(true)
两个方法一样,
1)由JSESSIONID获取session对象。
2)如果没有获取到session对象,就会创建session对象。
并将JSESSIONID以Cookie的形式写给浏览器。
2)
req.getSession(false)
获取session对象。获取不到返回null
3.5.2 获取session对应的JSESSIONID值
HelloServlet.java
public class HelloServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取session
HttpSession session = req.getSession();
String id = session.getId();
System.out.println(id);
}
}
3.5.3 Session的有效性
Session的有效性
Session在服务器端默认的有效时间是三十分钟,即三十分钟后,服务器自动回收。
JSESSIONID的默认的有效时间是一次会话。即一次会话后,浏览器丢失Cookie,从而
导致JSESSIONID的丢失,最终导致了Session实质性的失效。
总体来说,
Session的有效性最终是由Session在服务器端的有效时间和JSESSIONID在浏览器
端的有效时间共同决定的。
Session的有效性 = Min(Session在服务器端的有效时间,JSESSONID在浏览器端有效时间)
设置Session在服务器端的有效时间(服务器端)
以下两个方法只是设置了session在服务器中的有效时间。
即使设置了Session的有效时间,也只是设置了Session在服务器中的有效时间,
但也会由于浏览器关闭导致会话级别的Cookie丢失,从而导致JSESSIONID的丢失,
最终导致Session实质上的失效。
1)局部设置session的有效时间,单位为秒
session.setMaxInactiveInterval(int interval)
设置session的有效时间,单位秒
2)全局设置session的有效时间,单位为分钟
在web.xml中配置。
<!-- 修改session全局有效时间:分钟 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
1)局部设置session的有效时间
public class Hello1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建session
HttpSession session = req.getSession();
System.out.println(session.getId());
//设置session的有效时间为20秒
session.setMaxInactiveInterval(10);
}
}
2)全局设置session的有效时间
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 修改session全局有效时间:分钟 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>org.jsoft.demo.Hello1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/create</url-pattern>
</servlet-mapping>
</web-app>
设置JSESSIONID在浏览器端的有效时间(浏览器端)
将JSESSIONID以手动的形式写到Cookie,并修改Cookie的保存时间,单位为秒
Cookie cookie=new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(100);
resp.addCookie(cookie);
public class Hello1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建session
HttpSession session = req.getSession();
System.out.println(session.getId());
//设置JSESSIONID在浏览器端的有效时间100s
Cookie cookie=new Cookie("JSESSIONID",session.getId().toString());
cookie.setMaxAge(100);
resp.addCookie(cookie);
}
}
设置Session的有效性(设置Session整体上的有效时间)
Session的有效性由Session在服务器端的有效时间和JSESSIONID在浏览器端的有效时间共同决定。
public class Hello1 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建session
HttpSession session = req.getSession();
System.out.println(session.getId());
//设置Session在服务器端的有效时间为100秒
session.setMaxInactiveInterval(100);
//设置JSESSIONID在浏览器端的有效时间100s
Cookie cookie=new Cookie("JSESSIONID",session.getId().toString());
cookie.setMaxAge(100);
resp.addCookie(cookie);
}
}
注销Session
session.invalidate() : 销毁session对象
public class Hello2 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//销毁session
HttpSession session = req.getSession(false);
if(session!=null) {
session.invalidate();
}
System.out.println("删除session成功");
}
}
3.6 JSP中HttpSesison的坑点
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//没有登录返回登录界面
HttpSession session = req.getSession(false);
System.out.println(session);
if(session==null) {
req.getRequestDispatcher("/login.jsp").forward(req, resp);
return;
}
}
当用户没有登录访问list界面时,我们会做session判断,如果session不存在,
表示用户没有登录,就返回登录界面。
但是在含有jsp项目的页面中,会出现bug。
由于jsp本身含有内置对象session。当用户访问jsp页面时,即使没有登录,
但是也自动创建了session。这时,用户在登录list页面,就会由于session的存在而展示数据。
所以不能以session存在来判断用户是否登录。
3.7 浏览器关闭后,Session就销毁了吗?
话题:
当浏览器关闭后,Session就销毁了吗?
答案:
存在于浏览器上的唯一标识符JSESSIONID(sessionid)消失了,但是服务器中存放的sessionid并没有立马销毁。
分析:
1.用户访问jsp页面或者服务器调用req.getSession()时,就会创建session对象。
2.此时,Servlet容器为HttpSession对象分配一个唯一标识符即Sessionid,
同时将该JSESSINID以Cookie的形式写给浏览器,保存在浏览器端口。
3.浏览器每次发送请求时,都会带着该Cookie值。服务器从Cookie中取出JSESSIONID,
然后根据这个JSESSIONID找到相应的HttpSession对象,
从而获取用户的状态信息。
------------------------------------------------------------------------------
其实让Session结束生命周期,有以下两种办法:
一个是Session.invalidate()方法,不过这个方法在实际的开发
中,并不推荐,可能在强制注销用户的时候会使用;
一个是当前用户和服务器的交互时间超过默认时间后,Session会
失效。
最正常的办法就是不去管它,让它等到默认的时间后,自动销毁。那么为什么当我
们关闭浏览器后,就再也访问不到之前的session了呢?其实之前的Session一直都
在服务器端,而当我们关闭浏览器时,此时的Cookie是存在于浏览器的进程中的,
当浏览器关闭时,Cookie也就不存在了。
其实Cookie有两种:
一种是存在于浏览器的进程中;
一种是存在于硬盘上。
而session的Cookie是存在于浏览器的进程中,那么这种Cookie我们称为会话Cookie,当我们重新打开浏览器窗口时,之前的Cookie中存放的Sessionid已经不存在了,此时服务器从tpServletRequest对象中没有检查到sessionid,服务器会再发送一个新的存有Sessionid的Cookie到客户端的浏览器中,此时对应的是一个新的会话,而服务器上原先的session等到它的默认时间到之后,便会自动销毁。
附加:
当在同一个浏览器中同时打开多个标签,发送同一个请求或不同的请求,仍是同一个session;
当不在同一个窗口中打开相同的浏览器时,发送请求,仍是同一个session;
当使用不同的浏览器时,发送请求,即使发送相同的请求,是不同的session;
当把当前某个浏览器的窗口全关闭,再打开,发起相同的请求时,是不同的session。
四、总结
1)会话管理: 管理浏览器和服务器之间的会话过程中产生的会话数据
2)Cookie技术: 会话数据保存在浏览器客户端。
Cookie核心的API:
2.1 在服务器端创建Cookie对象
Cookeie cookie = new Cookie("name","value");
2.2 把cookie发送给浏览器端(通过响应头:set-cookie)
response.addCookie(cookie);
2.3 浏览器带着cookie信息访问服务器(通过请求头:cookie),服务器得到cookie信息
Cookie[] cookies = request.getCookies();
局限:
1)只能保存字符串类型,不能保存中文
2)一个cookie不能超过4kb
3)Session技术:会话数据保存在服务器端。(内存)
Session核心的API:
3.1 创建或得到session对象
HttpSession session = request.getSession(); //创建或得到session对象
request.getSession(false); //得到session对象
3.2 会话数据保存session对象中,和得到会话数据
session.setAttribute("name",Object); 保存数据
session.getAttribute("name") 得到数据
注意:
1)session.setIntactiveInterval(时间); 设置session过期时间
2)session.invalidate() 手动销毁session对象