Cookie与Session会话
一、会话技术
(一)、什么是会话技术
用户打开浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,这个过程称之为一个会话。
(一)、会话技术解决什么问题
保存各个客户端自己的数据,每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要为每个用户保存这些数据。
二、Cookie与Session介绍
(一)、Request域和ServletContext存储数据存在的问题
1、Request域
使用request域存储的问题,request域的生命周期为请求开始时创建,请求结束后销毁,没有办法进行对多个数据进行存储。
2、ServletContext域
使用servletcontext存在的问题,servletcontext生命周期较长,服务器启动时创建,服务器关闭时销毁,数据存放在这里容易导致各个浏览器之间的数据混淆,浪费浏览器资源。
(二)、Cookie
Cokie是一种会话技术,也是一个域,它也可以进存储保存数据。
Cookie技术就服务器将数据存入浏览器缓存区,当服务器使用时就会去客户浏览器调用。
(三)、Session
Session也是一个域,它和Cookie不同它是,存储在服务器的,当浏览器访问服务器时创建,他会单独为该浏览器开辟一个Seeion域存储该浏览器的数据,当服务关闭或过期时被销毁。
三、Cookie的使用
(一)、将Cookie存入浏览器缓存区
- 创建Cookie
- Cookie cookie = new Cookie(String cookieName,StringcookieValue);
- Cookie会以会相应头的形式发送给客户端
- Cookie只能存储非中文的字符串
- 响应给浏览器
@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1、创建Cookie
Cookie cookie = new Cookie("name1","Cookie");
// 2、响应给浏览器
response.addCookie(cookie);
}
}
访问结果
-
第一次访问(获取当前的时间,并把它写到cookie当中,响应给浏览器)
-
第二次访问(请求头当中就能够看到cookie信息)
-
访问服务器的任何资源,一般情况下都会把cookie带去过
(二)、设置Cookie持久化存储的时间
默认情况下Cookie是会话级别的,就是打开浏览器,关闭浏览器视为一次会话。如果不设置它持久化存储的时间,Cookie会存储在浏览器的内存中,浏览器关闭时Cookie信息销毁。
设置存储时间
@WebServlet("/CookieServlet")
public class CookieServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1、创建Cookie
Cookie cookie = new Cookie("name1","Cookie");
// 设置持久化存储时间
cookie.setMaxAge(60);
// 2、响应给浏览器
response.addCookie(cookie);
}
}
注意:
设置时间的单位为秒,如果设置了持久化存储时间,cookie信息就会被存储到浏览器磁盘文件里,过期后会自动删除。
(三)、设置Cookie的携带路径
访问某一个资源时,要不要每次都携带cookie信息,如果外部资源每次都携带,会影响传输的速度。
如果不设置携带路径,默认情况下在访问创建cookie的web资源相同的路径相同都携带cookie信息。
@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1、创建Cookie
Cookie cookie = new Cookie("name1","Cookie");
// 设置持久化存储时间
cookie.setMaxAge(60);
// 设置携带路径 默认路径:http://localhost:8080/Cookie/CookieServlet
cookie.setPath("/Cookie/CookieServlet");
// 2、响应给浏览器
response.addCookie(cookie);
}
}
(四)、删除Cookie细腻信息
删除Cookie信息就是将setMaxAge(0)方法的参数设置为0即可。
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1、创建Cookie
Cookie cookie = new Cookie("name1","Cookie");
// 删除Cookie信息
cookie.setMaxAge(0);
(五)、获取指定的Cookie
通过Request对象的getCookies()方法获取所有的cookie信息,要进行遍历,找出自己需要的即可
@WebServlet("/CookieServlet")
public class CookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取所有的coookie
Cookie[] cookies = request.getCookies();
if(cookie != null) {
for (Cookie C : cookies) {
String name = C.getName();
if(name.equals("name")) {
response.getWriter().write("name = value"+C.getValue());
}
}
}
}
}
四、Session使用
Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间,Session需要借助于Cookie存储客户的唯一性标识SESSIONID。
(一)、Session域的生命周期
- 创建
- 第一次执行request.getSession()时创建。
- 销毁
- 服务器关闭时
- session过期/失效(默认30分钟),是从最后一次操作结束时计时
- 手动销毁,调用invalidate()方法
- 作用范围
- 默认在一次会话中,也就是说在一次会话中任何资源公用一个session对象
(二)、Session域持久化JSessionID
因为session是会话级别的,所以当把对象放入到session 中时,只在当前对话窗口中的session中存在。当当前窗口关闭时,session就会没了。当我们想要持久化这个session时,我们需要用到cooik中的JSESSIONID。我们先了解一下session的运行机制.
-
第一次向服务器发送请求时在服务器端创建Session对象,该对象有一个唯一的ID
-
在创建Session对象的同时会创建一个特殊的Cookie对象,该Cookie对象的名字是一个固定值JSESSIONID,该对象的值就是Session对象的ID值,同时会将这个特殊的Cookie对象发送给浏览器.
-
以后浏览器在发送就会携带这个特殊的Cookie对象
-
服务器获取JESSIONID的这个Cookie对象的value之后,在服务器中查找与之想对应的Session对象,来区分不同的用户
session对象的获取 :HttpSession session = request.getSession()
所以我们想要持久化Session对象,我们只需要持久化JSESSIONID对应的Cookie对象就可以了。
//获取Cookie对象
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie cookie : cookies) {
//获取Cookie的名字
String name = cookie.getName();
if("JSESSIONID".equals(name)){
//持久化该Cookie对象
cookie.setMaxAge(60);
//将Cookie对象发送给浏览器
response.addCookie(cookie);
}
}
}
这样的话就把session持久化了,其实,session就是一种特殊的Cookie.