Cookie是1993年由网景公司(Netscape)前雇员发明的一种进行网络会话状态跟踪的技术。
会话是由一组请求与响应组成,是围绕着一件相关事情所进行的请求与响应。所以这些请求与响应之间一定是需要有数据传递的,即是需要进行会话状态跟踪的。然而HTTP协议是一种无状态协议,在不同的请求间是无法进行数据传递的。此时就需要一种可以进行请求间数据传递的会话跟踪技术,而Cookie就是一种这样的技术。
cookie是由服务器生成,保存在客户端的一种信息载体。这个载体中存放着用户访问该站点的会话状态信息。只要Cookie没有被清空,或者 Cookie没有失效,那么,保存在其中的会话状态就有效。
用户在提交第一次请求后,由服务器生成Cookie,并将其封装到响应头中,以响应的形式发送给客户端。客户端接收到这个响应后,将cookie 保存到客户端。当客户端再次发送同类请求后,在请求中会携带保存在客户端的Cookie 数据,发送到服务端,由服务器对会话进行跟踪。
Cookie技术并不是JavaWeb开发专属技术,而是属于web开发的技术,是所有web开发语言均支持的技术。Cookie是由若干键值对构成,这里的键一般称为name,值称为value。Cookie 中的键值对均为字符串。
@WebServlet(name = "Servlet1", value = "/Servlet1")
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 生成Cookie
Cookie cookie1 = new Cookie("username", "pangjian");
Cookie cookie2 = new Cookie("password", "123");
// 添加到响应体
response.addCookie(cookie1);
response.addCookie(cookie2);
response.sendRedirect("/studentweb/Servlet2");
}
}
@WebServlet(name = "Servlet2", value = "/Servlet2")
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取,服务端是不用存储Cookie的
Cookie[] cookies = request.getCookies();
for (Cookie c : cookies) {
System.out.println(c.getName() + c.getValue());
}
response.getWriter().print("获取cookie");
}
}
Session,即会话,是 web开发中的一种会话状态跟踪技术。前面的Cookie也是一种会话跟踪技术。不同的是cookie是将会话状态保存在了客户端,而Session则是将会话状态保存在了服务器端
“会话”是当用户打开浏览器,从发出第一次请求开始,一直到最终关闭浏览器,就表示一次会话的完成。
Session并不是Javaweb开发所特有的,而是整个web开发中所使用的技术。在JavaWeb开发中,Session是以javax.servlet.http.HttpSession的接口对象的形式出现的。
@WebServlet(name = "Servlet1", value = "/Servlet1")
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Session创建
HttpSession httpSession = request.getSession(true);
httpSession.setAttribute("username", "pangjian");
response.sendRedirect("/studentweb/Servlet2");
}
}
@WebServlet(name = "Servlet2", value = "/Servlet2")
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Session获取
// 获取时候设置为false,当获取不到Session时不新建一个Session
HttpSession httpSession = request.getSession(false);
String username = null;
if (httpSession != null) {
username = (String) httpSession.getAttribute("username");
}
response.getWriter().print(username);
}
}
在服务器中系统会为每个会话维护一个 Session。不同的会话,对应不同的session。
服务器对当前应用中的Session是以Map 的形式进行管理的,这个Map称为 session列表。该Map的 key为一个32位长度的随机串,这个随机串称为JSSESSIONID , value则为 session对象的引用。当用户第一次提交请求时,服务端servlet中执行到request.getsession()方法后,会自动生成一个 Map.Entry对象,key为一个根据某种算法新生成的JSessionID,value则为新创建的HttpSession对象。
在将session信息写入Session列表后,系统还会自动将“JSSESSIONID”作为name,这个32位长度的随机串作为value,以cookie的形式存放到响应报头中,并随着响应,将该Cookie发送到客户端。
客户端接收到这个Cookie 后会将其存放到浏览器的缓存中。即只要客户端浏览器不关闭,浏览器缓存中的Cookie就不会消失。当用户提交第二次请求时(为了保证第二次请求是该会话中,Cookie存了JSSESSIONID和资源路径),会将缓存中的这个Cookie,伴随着请求的头部信息,一块发送到服务端。
服务端从请求中读取到客户端发送来的cookie,并根据cookie的JSSESSIONID的值,从Map中查找相应 key所对应的value,即session对象。然后,对该Session对象的域属性进行读写操作。