Web会话技术
web会话可简单理解为:用户开一个浏览器,访问某一个web网站,在这个网站点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话.
例如:
- 打开浏览器
- 访问京东, 此时 与京东网站 产生了会话
- 访问京东的具体商品页面; 或 其他页面; 或访问了其他网站, 此时,一直会与京东网站保持着会话连接
- 关闭浏览器, 此时 与京东网站的会话结束;
重写打开浏览器,再次访问京东, 这就是第二次会话了
Java Web开发中使用的会话技术
在客户端与服务器端交互的过程中,通常会产生一些数据, 为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。
- Cookie对象:
客户端浏览器的会话技术,它可以把服务器传递过来的一些数据记录在客户端浏览器中,解决会话从什么时候开始,到什么时候结束。 - Session对象:
服务器端的会话技术, 它可以把同一用户与服务器多次请求响应的一些数据记录在服务器Session域中, 实现该用户在本次会话中, 可随时获取Session域中的数据, 满足多次请求响应之间 进行数据传递\访问使用.
可以用一个简单的比喻去描述,人们去超市买东西的时候,会去存取柜存放物品,而存完物品之后,存取柜会给人们一张条形码的单子,而这个纸条可以粗略的理解为Cookie,也就是服务端在客户端存储的信息,用于做一个凭证,知道客户端是谁,而Session就相当于这个存取柜,每一个不同的用户来超市购物的时候,占用的是自己的存取柜,而不会去其他人的柜子拿东西,而用户离开超市的时候,这个存取柜就会被释放出来,而不继续占有,就可以理解为这个会话结束了
Cookie
什么是Cookie
Cookie对象: 客户端浏览器的会话技术,它可以把服务器传递过来的一些数据记录在客户端浏览器中,解决会话从什么时候开始,到什么时候结束。
小结:
- 在客户端保存的数据, 数据产生是在服务器
- 在浏览器中Cookie是以文本的形式保存数据
cookie的应用场景
- 判断用户是否登陆过网站,以便下次登录时能够实现自动登录(或者记住密码)。如果我们删除cookie,则每次登录必须从新填写登录的相关信息。
- 保存上次登录的时间等信息。
- 保存上次查看的页面
- 浏览计数。
Cookie的使用
服务器向浏览器发送Cookie
把服务器端想要保存在客户端的数据, 通过Cookie来完成; 保存在客户端的数据 都是较小的文本数据.
实现步骤:
- 创建Cookie对象,直接new Cookie(String key,String value)
- 将Cookie数据保存到客户端, 使用response对象方法 addCookie()
API:
-
Cookie类
//构造方法: Cookie(String key, String value) , 用于创建Cookie对象, 并指定Cookie中保存的键值对信息 -
Response对象
//方法: addCookie(Cookie c), 用于将指定的Cookie对象 响应回 客户端浏览器
代码演示:
@WebServlet("/simple")
public class CookieServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("yourname","kehao");
resp.addCookie(cookie);
}
}
服务器从浏览器获取Cookie
Request对象
Cookie[] getCookies();
Cookie对象
public String getName();//获取Cookie的名字
public String getValue();//获取Cookie的值
示例代码:
@WebServlet("/getcookie")
public class CookieServlet4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Arrays.stream(req.getCookies()).forEach(cookie -> System.out.println(cookie.getName()+"---"+cookie.getValue()));
}
}
Cookie的携带路径
当服务端在客户端存储了Cookie之后,每次网页发起请求的时候会讲之前存储的Cookie发送到服务器,而Cookie的携带路径就指的是,在什么样的路径才会携带这个Cookie,而什么路径下不携带,能够携带Cookie的路径就称为Cookie的携带路径
cookie默认的携带路径
默认情况下,网页访问发送Cookie的当前层级以及子层级会携带Cookie 否则不会携带Cookie
修改cookie的携带路径
Cookie对象
setPath("cookie的携带路径")
用于设置cookie携带路径, 若参数写成 request.getContextPath()代表web应用下任意资源都携带本Cookie
代码演示:
@WebServlet("/location/test")
public class CookieServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("location", "1");
cookie.setPath(req.getContextPath());
resp.addCookie(cookie);
resp.getWriter().println("test");
}
}
Cookie的生存时间
浏览器中Cookie是有生存时间的, 默认是当前会话.浏览器关闭,该会话结束.
可以通过更改Cookie的生存时间, 来延长Cookie的生存时间
Cookie对象
setMaxAge(int 秒)
更改Cookie的生存时间, 参数单位: 秒
删除已存在的Cookie
要删除已经存在的cookie,后一个用来覆盖的新cookie, 必须名称与路径与原来的cookie一致
-
覆盖原有Cookie的需要满足的要求:
-
保证同名键
-
保证相同的携带路径
-
setMaxAge(0)
对获取到传来的Cookie setMaxAge(0)是无效的
-
Session
什么是Session
Session对象: 服务器端的会话技术, 它可以把同一用户与服务器多次请求响应的一些数据记录在服务器Session域中, 实现该用户在本次会话中, 可随时获取Session域中的数据, 满足多次请求响应之间 进行数据传递\访问使用.
- Session与Cookie是紧密相关的。 Session的使用要求用户浏览器必须支持Cookie,如果浏览器不支持使用Cookie,或者设置为禁用Cookie,那么将不能使用Session。
- Session信息对客户来说,不同的用户, 使用不同的Session信息来记录。当用户启用Session时,Tomcat引擎自动产生一个SessionID. 在新会话开始时,服务器将SessionID当做cookie存储在用户的浏览器中。
session与cookie的区别
| cookie | session | |
|---|---|---|
| 会话数据保存的位置 | 浏览器 | 服务器 |
| 数据的安全性 | 不安全 | 安全 |
| 存储数是否有限制 | 有 | 无 |
Session的基本使用
Session域对象
session对象是HttpSession接口的实现类对象, session对象由tomcat引擎创建. 实现将某些数据放入session中,供同一用户的不同页面使用
- 作用域范围 : 一次会话有效(浏览器不关闭)
实现步骤:
- 使用Request的getSession() 当session存在时返回该session,否则新建一个session并返回该对象
- 通过session对象的setAttribute\getAttribute 进行数据的存取
API:
- 域对象存储数据: setAttribute(String key,String value)
- 取出域对象数据: Object getAttribute(String key)
- 移除域对象数据: removeAttribute(String key)
持久化Session对象
默认的Session在浏览器关闭之后就失效了,Session的实现在于每个session对象都有个唯一标识 JSESSIONID, 每当调用getSession()的时候,Tomcat会将JSESSIONID存储在客户端Cookie中,然而Cookie的默认状态就是关闭浏览器失效,所以我们可以手动的将这个Cookie的时效边长,使得Session能够持久化,因为在Cookie对象删除的时候,服务器是不知道的,所以Session对象依然还在内存之中,而只要延长了Cookie的时效,那么下一次打开浏览器的时候,依然会将Cookie传给服务端,保证了持久化
String sessionId = session.getId();
Cookie cookie = new Cookie("JSESSIONID", sessionId);
cookie.setPath( request.getContextPath());
cookie.setMaxAge(60*10);
response.addCookie(cookie);
session生命周期
- session创建时机
- 浏览器在servlet中第一次使用session时候,通过getSession方法创建;
- 浏览器第一次访问jsp的时候,服务器也会为这个浏览器创建一个session对象;
- session销毁时机
-
程序员调用invalidate方法;(立刻销毁)
-
设置的存活时间到了;(默认是30分钟)
这个时间可以通过修改web.xml去修改<session-config> <session-timeout>30</session-timeout> </session-config> -
服务器非正常关闭;(突然断电)
注意事项:
1:正常关闭服务器,session不会销毁,而是直接序列化到硬盘上,下一次服务器启动的时候,会重新创建出来;
2:如果浏览器单方面关闭会话,服务器上对应的session不会死亡
,但是会导致服务器给浏览器创建的JSESSIONID的cookie死亡,当cookie死亡后,会导致浏览器无法找到上一个session对象,会造成服务器中session死亡的假象;